C# Linq Reverse-它是保留变量更改还是复制

C# Linq Reverse-它是保留变量更改还是复制,c#,linq,reverse,C#,Linq,Reverse,我有一本关于字符串和日期的词典 private readonly Dictionary<string, DateTime> 专用只读词典 作为类中的私有成员变量 我有一些方法,它们递归地获取字典中给定特定键的下一个和上一个值 e、 g。 它接受给定的键,进行数据库查找,如果为空,则递归地获取下一个键,以此类推。它向前和向后都这样做 我用这个来做下一个 我的问题是,我是否可以简单地将Reverse添加到linq语句中以向后执行此操作 显然,它会起作用,但我担心它会将我的成员变量列

我有一本关于字符串和日期的词典

private readonly Dictionary<string, DateTime>
专用只读词典
作为类中的私有成员变量

我有一些方法,它们递归地获取字典中给定特定键的下一个和上一个值

e、 g。 它接受给定的键,进行数据库查找,如果为空,则递归地获取下一个键,以此类推。它向前和向后都这样做

我用这个来做下一个

我的问题是,我是否可以简单地将Reverse添加到linq语句中以向后执行此操作

显然,它会起作用,但我担心它会将我的成员变量列表留在哪个状态

i、 e.它会被逆转吗?或者,在进行反向操作时是否已复制


感谢可枚举。反向

不会改变调用它的顺序。

任何Linq方法(包括反向)都不会改变传递给它们的可枚举,除非枚举可枚举会导致更改(您应该知道情况是否如此;很少有内置的可枚举类型会对数据访问产生副作用)


由于reverse需要知道集合的基数,所以它可能做的是将可枚举元素拖到一个数组中,并进行反向迭代。许多常用的可枚举Linq方法(如OrderBy)都是在幕后进行此操作的。

正如其他人所说,可枚举。reverse不会改变底层的sequence(除非在罕见的情况下,对序列进行枚举会改变它)

但是,请注意,如果您使用的是列表,则可能会调用List.Reverse,这会更改列表

List<int> list = /* initialize */;
IEnumerable<int> asEnumerable = list;

// these call List<int>.Reverse(), which changes the list
list.Reverse();
((List<int>)asEnumerable).Reverse();

// these call Enumerable.Reverse<int>(), which does not change the list, but returns a new IEnumerable<int>
asEnumerable.Reverse();
((IEnumerable<int>)list).Reverse();
((IList<int>)list).Reverse();
List List=/*初始化*/;
IEnumerable asEnumerable=列表;
//这些调用List.Reverse(),将更改列表
list.Reverse();
((List)asEnumerable.Reverse();
//这些函数调用Enumerable.Reverse(),它不会更改列表,但会返回一个新的IEnumerable
asEnumerable.Reverse();
((IEnumerable)列表);
((IList)list.Reverse();

抱歉,我本想对其他正确答案中的一个作出评论,但我想包含代码。

这样成员变量将保持其原始顺序?即不反转?@Christo Fur:正确。(此外,这是您可以轻松测试自己的东西。)@Christo,通常情况下使用,LINQ不会改变原始集合或其中的对象,但会过滤/项目/组/顺序,以允许您直观地使用代码中的数据结构。非常正确。我来试试。对于
IList
,这也是真的吗?@MeirionHughes否,因为IList接口不需要Reverse方法。因此将调用Enumerable.Reverse。