2011-11-24 64 views
2

我有一个不同DayTime(Ticks)的列表。我尝试获取从现在到每个时间元素的剩余时间的列表。如何更改列表中的每个元素<long>?

List<long> diffliste = new List<long>(m_DummyAtTime); 

// 864000000000 ≙ 24h 
diffliste.ForEach(item => { item -= now; if (item < 0) item += 864000000000; }); 

// test, does also not work 
// diffliste.ForEach(item => { item -= 500; }); 

但是,列表没有改变。我想念什么? (nowDateTime.Now.TimeOfDay.Ticks

回答

2
var times = diffliste.Select(ticks => new DateTime(ticks) - DateTime.Now); 

会回到现在,每次之间的时间跨度的集合。

不使用LINQ:

List<TimeSpan> spans = diffliste.ConvertAll(ticks => new DateTime(ticks) - DateTime.Now); 

(修改由马克的建议)

+0

此**不会**更新现有列表,这是OP要求的。它也**不**返回一个集合(它返回一个延迟*序列*) –

+0

@Marc,我知道,但我怀疑这是OP所需要的,虽然他没有明确要求它 –

+0

这看起来像一个很好的解决方案。它是否需要LINQ或特殊的.NET框架?出于兼容性原因,我无法使用它。 – Nikodemus

1

您正在更改局部变量(以及实际参数)中的独立副本,而不是列表中的实际值。为了做到这一点,也许是:

for(int i = 0 ; i < diffliste.Count ; i++) { 
    long val = diffliste[i]; // copy the value out from the list 
    ... change it 
    diffliste[i] = val; // update the value in the list 
} 

最后,当前的代码在语义上类似于:

long firstVal = diffliste[0]; 
firstVal = 42; 

并不在列表中42改变第一个值(它只会改变局部变量)。

1

您无法在每个foreach循环中更改项目的值。
您可以使用循环的经典或创建项目并将其分配给新列表。

for (int i = 0 ; i < diffliste.Count; i++) 
{ 
    long value = diffliste[i]; 
    // Do here what you need 
    diffliste[i] = value; 
} 
0

在foreach循环迭代VAR是不变的,所以你不能改变它。您必须创建一个新列表或使用循环...另请参阅here

+1

OP没有使用'foreach',它们使用'ForEach' - 虽然类似,但它将值作为参数公开给委托,它*是*可变的......它只是不以任何方式更改列表中的基础值 –

+0

Doh!感谢指责Marc。 :) – mamoo

相关问题