1

是否可以在 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。

4

4 回答 4

3

我想你正在寻找这个:

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

解释:

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

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

于 2013-08-28T14:39:32.413 回答
0

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

你要

var groupsCollection = groups.Select(g => {
    return ...;
}).ToList();
于 2013-08-28T14:37:23.470 回答
0

正如你所说,你知道使用ForEach是相关的。但是,您只是好奇是否可以以另一种方式进行。正如其他人指出的那样,您可以使用Select{...}应该返回一些值。但是,您可以这样做,如果您想这样做更好,stop或者break根据某些条件使用循环TakeWhile

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.
    });
于 2013-08-28T15:11:40.473 回答
0

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

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

于 2013-08-28T14:39:20.800 回答