如何更改List中的每个元素

本文关键字:元素 何更改 List long | 更新日期: 2023-09-27 18:15:31

我有一个不同的白天(刻度)列表。我试着得到从现在到每个时间元素的剩余时间列表。

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)

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

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

将返回从现在到每次之间的TimeSpans的集合。

不使用Linq:

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

(根据Marc建议修改)

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

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(它只会更改局部变量)。

不能更改foreach循环中的项的值。
您可以使用经典的for循环或创建并分配项到新列表。

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

foreach循环中的迭代变量是不可变的,因此您不能更改它。你要么创建一个新的列表,要么使用for循环…