如何解决类型兼容性和LINQ之谜
| 我有一段代码:List<OneFeat> Feats;
...
List<OneFeat> Results = new List<OneFeat>(0);
foreach (OneFeat Test in Feats)
if (String.Compare(Test.Name,Target,true) == 0)
Results.Add(Test);
return Results;
Resharper提供:
List<OneFeat> Results = new List<OneFeat>(0);
Results.AddRange(Feats.Where(Feat => String.Compare(Feat.Name,true) == 0));
return Results;
当然有效。但是,它正在创建一个列表并将其添加到空列表中,因此我尝试将其简化为:
return Feats.Where(Feat => String.Compare(Feat.Name,true) == 0));
不会编译,因为它需要强制转换。如果添加演员表,它将在运行时失败。
有什么方法可以在不复制结果列表的情况下进行编码?
解决方法
或者,您可以在Where语句的末尾添加.ToList(),如下所示:
return Feats.Where(Feat => String.Compare(Feat.Name,Target,true) == 0)).ToList();
,啊哈,列表与枚举!
但是,它正在创建一个列表并
将其添加到空列表
不,它不是在创建列表-否则您的最后一行会起作用。它会在列表中添加IEnumerable
。
Where
运算符返回IEnumerable
,它不是\'list \'-更像是一个散乱,可迭代且非具体的集合。
当您调用AddRange
时,此集合将被迭代并添加到空白列表中。我希望这与简单地对结果调用ToList
非常相似。
起初很难理解这个概念,但可以将ѭ4视为返回数据而不是数据集合的函数。如果您列出了由where子句过滤的项目列表,然后更改了这些项目的值,则该列表不会更改-它已经创建,并且不会根据以下内容删除或添加项目这些值(除非您明确地这样做)。
但是,通过枚举,仅在需要时才从基础集合中延迟检索项目。因此,您可以对集合中由where子句过滤的项目进行枚举,然后更改所有值,以使所有值都不与过滤器匹配,并且从枚举中检索时,该值为空。
,如果您只想枚举匹配的Feats列表,则将返回类型更改为IEnumerable<OneFeat>
。如果必须返回实际列表,则必须将其复制,因为原始的Feats对象不代表与Test.Name匹配的功能的子集。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。