繁体   English   中英

Linq的Lambda声明

[英]Lambda Statements in Linq

是否有可能在Linq中执行以下操作?

List<Group> groupsCollection = new List<Group>();
groups.Select( g => {
    String id = g.Attributes["id"].Value;
    String title = g.Attributes["title"].Value;
    groupsCollection.Add( new Group(id, title) );
} );

这只是一个例子。 我知道Foreach循环就足够了,但我在询问它是否可行。

我试过了,它说:

Cannot convert lambda expression to type System.Collections.IEnumerable<CsQuery.IDomObject> because it's not a delegate type

编辑:组是我的自定义类。 组是CsQuery Dom对象的集合。 您可以将它们视为html锚元素的集合。 它们是IEnumerable。

我想你正在寻找这个:

groupsCollection = groups.Select(g =>
    new Group(g.Attributes["id"].Value,
              g.Attributes["title"].Value)).ToList();

说明:

Select()将序列的每个元素投影到新表单中。 (来自MSDN

它基本上是一个转换函数,它接受一个I​​Enumerable并以任何你喜欢的方式将它转换为另一个IEnumerable,这似乎正是你想要的。

Select()接受一个返回值的lambda表达式; 它不应该有任何生效。

你要

var groupsCollection = groups.Select(g => {
    return ...;
}).ToList();

您可以使用构造函数使用查询对其进行初始化:

var query = groups.Select( g => {
    String id = g.Attributes["id"].Value;
    String title = g.Attributes["title"].Value;
    return new Group(id, title);
});
List<Group> groupsCollection = new List<Group>(query);

不要修改linq查询中的colections,而是选择可用于修改集合的数据。

正如你所说,你知道使用ForEach是相关的。 但是,如果你能以另一种方式做到这一点,你只是好奇 正如其他人指出的那样,您可以使用Select{...}的代码应该返回一些值。 但是,您可以这样做,如果您想使用TakeWhile根据某些条件stopbreak循环,这样做会更好:

groups.TakeWhile( g => {
       String id = g.Attributes["id"].Value;
       String title = g.Attributes["title"].Value;
       groupsCollection.Add( new Group(id, title) );
       return true;//If you want to break the loop, just return false accordingly.
    });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM