我有一个不同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; });
但是,列表不会更改。我错过了什么吗?
(now
为DateTime.Now.TimeOfDay.Ticks
)
答案 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。