如何更改List <long>?</long>的每个元素

时间:2011-11-24 10:02:01

标签: c#

我有一个不同DayTime(Ticks)的列表。我试着获得从现在到每个时间元素的剩余时间列表。

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

4 个答案:

答案 0 :(得分:2)

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

将在现在和每次之间返回一组TimeSpans。

不使用Linq:

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

(根据Marc的建议修改)

答案 1 :(得分: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(它只会更改局部变量)。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

foreach循环中的迭代var是不可变的,因此您无法更改它。您必须创建新列表或使用for循环...另请参阅here