Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何更改列表中的每个元素<;长>;?_C# - Fatal编程技术网

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);