C# 如何更改列表中的每个元素<;长>;?
我有一个不同白天(节拍)的列表。我试图得到从现在到每个时间元素的剩余时间列表C# 如何更改列表中的每个元素<;长>;?,c#,C#,我有一个不同白天(节拍)的列表。我试图得到从现在到每个时间元素的剩余时间列表 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 // di
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; });
List diffliste=新列表(m_DummyAtTime);
// 864000000000 ≙ 24小时
ForEach(item=>{item-=now;if(item<0)item+=864000000000;});
//测试,也不起作用
//ForEach(item=>{item-=500;});
但是,该列表没有更改。我错过什么了吗?
(
now
是DateTime.now.TimeOfDay.Ticks
)您正在更改局部变量(实际上是参数)中的独立副本,而不是列表中的实际值。为此,或许:
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
}
它也不会将列表中的第一个值更改为42(它只会更改局部变量)。您不能更改foreach循环中项目的值。
您可以使用classic for cycle或创建项目并将其分配给新列表
for (int i = 0 ; i < diffliste.Count; i++)
{
long value = diffliste[i];
// Do here what you need
diffliste[i] = value;
}
for(int i=0;i
将返回从现在到每次之间的时间跨度集合
不使用Linq:
List<TimeSpan> spans = diffliste.ConvertAll(ticks => new DateTime(ticks) - DateTime.Now);
List span=diffliste.ConvertAll(ticks=>newdatetime(ticks)-DateTime.Now);
(根据Marc的建议修改)foreach循环中的迭代变量是不可变的,因此您不能更改它。您要么创建一个新列表,要么使用for循环。。。另请参见。这不会更新OP要求的现有列表。它也不会返回一个集合(它返回一个延迟序列)@Marc,我知道,但我怀疑这正是OP需要的,尽管他没有明确请求它。这看起来是一个不错的解决方案。它需要LINQ还是特殊的.NET框架?出于兼容性原因,我当时无法使用它。@Nikodemus,是的,它使用Linq to对象,如果您没有访问.net>=3的权限,我想您可以忽略我的帖子。5@Nikodemus,我用一个不使用LINQT的解决方案更新了我的帖子OP没有使用
foreach
,他们正在使用foreach
——尽管类似,这会将值作为参数公开给委托,委托是可变的。。。它只是不会以任何方式更改列表中的基础值
var times = diffliste.Select(ticks => new DateTime(ticks) - DateTime.Now);
List<TimeSpan> spans = diffliste.ConvertAll(ticks => new DateTime(ticks) - DateTime.Now);