C# Linq中的Lambda语句

C# Linq中的Lambda语句,c#,.net,linq,csquery,C#,.net,Linq,Csquery,在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) ); } );

在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。

Select接受返回值的lambda表达式;它不应该有任何sife效应

你想要

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查询中修改集合,而是选择可用于修改集合的数据。

我想您正在寻找以下内容:

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

Select将序列中的每个元素投影到新表单中。从


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

正如您所说,您知道使用ForEach是相关的。然而,你只是好奇你是否能用另一种方式来做。正如其他人指出的,您可以使用Select,但是{…}中的代码应该返回一些值。但是,如果您想根据某些情况使用TakeWhile停止或中断循环,则可以采用这种方式,这会更好:


或者更大的问题是,什么是变量组?自定义AddRange重载会更干净。您可以始终使用迭代器块编写方法,将某些内容包装为IEnumerable,说明可以使用foreach循环执行的操作。这假设变量组是IEnumerableIf groups不是IEnumerable。OP代码中的错误会有所不同。您可以如果您愿意,可以用do=>expression代替=>{statement;}。谢谢您的支持,Eren.:@JoeCool没问题:很抱歉,您的最新更新无效-IEnumerable上没有ForEach扩展方法。Foreach是列表中的一个方法,它早于linq。我不建议使用它。
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.
    });