C# 在什么情况下,我们必须在linq查询中使用扩展方法作为AsEnumerable()和ToList()

C# 在什么情况下,我们必须在linq查询中使用扩展方法作为AsEnumerable()和ToList(),c#,linq-to-sql,C#,Linq To Sql,这里我们使用的是AsEnumerable()扩展方法 IEnumerable<string> strings = grdLookupPracticeMultiple.GridView.GetSelectedFieldValues("ID").Select(s => (string)s).AsEnumerable(); IEnumerable strings=grdlookuppractionmultiple.GridView.GetSelectedFieldValues(“I

这里我们使用的是AsEnumerable()扩展方法

IEnumerable<string> strings = grdLookupPracticeMultiple.GridView.GetSelectedFieldValues("ID").Select(s => (string)s).AsEnumerable();
IEnumerable strings=grdlookuppractionmultiple.GridView.GetSelectedFieldValues(“ID”).Select(s=>(string)s.AsEnumerable();
这里的
(string)s
意思是
(string)s
在上下文中只是说“将变量
s
转换为类型
string
”——我猜
GetSelectedFieldValues(“ID”)
返回
对象,您需要一个
字符串的序列。实际上有一个
.Cast()
可以帮你完成这项工作

至于何时需要
aseneumerable()
——实际上很少——在这种情况下可能不会。关键的情况是,如果不是这样的话,情况就不一样了。也许您明确希望将
IQueryable
视为
IEnumerable
(强制LINQ到对象,而不是查询组合)。或者,您可能正在处理类似于
数据集
的问题,其中
等实际上不是任何
t
IEnumerable,需要帮助

至于何时使用
.ToList()
:当您想要创建数据的快照时。目前,
strings
是数据上的延迟执行序列。它将在您对其进行
foreach
操作时执行。因此:如果列表从现在到那时发生更改:您将获得更新的内容。通常,您希望数据保持现在的状态

编辑:实际上,在本例中,
GetSelectedFieldValues
返回一个快照,因此:在本例中,它实际上不会更新,但在许多其他情况下:它可能会更新;所以:这是需要考虑的

总之,你可能只想:

var strings = grdLookupPracticeMultiple.GridView.GetSelectedFieldValues("ID")
                      .Cast<string>().ToList();
var strings = grdLookupPracticeMultiple.GridView.GetSelectedFieldValues("ID")
                      .ConvertAll(s => (string)s);