16

如果我有类型的变量,IEnumerable<List<string>>是否有一个 LINQ 语句或 lambda 表达式我可以应用到它,它将组合返回的列表IEnumerable<string>

4

6 回答 6

34

SelectMany - 即

        IEnumerable<List<string>> someList = ...;
        IEnumerable<string> all = someList.SelectMany(x => x);

对于 someList 中的每个项目,这将使用 lambda "x => x" 来获取内部项目的 IEnumerable<T>。在这种情况下,每个“x”都是一个 List<T>,它已经是 IEnumerable<T>。

然后将它们作为连续块返回。本质上,SelectMany 类似于(简化):

static IEnumerable<TResult> SelectMany<TSource, TResult>(
    this IEnumerable<TSource> source,
    Func<TSource, IEnumerable<TResult>> selector) {

    foreach(TSource item in source) {
      foreach(TResult result in selector(item)) {
        yield return result;
      }
    }
}

虽然这有点简化。

于 2008-09-29T19:50:00.983 回答
7

怎么样

myStrings.SelectMany(x => x)
于 2008-09-29T20:16:52.090 回答
2

不完全是单个方法调用,但您应该能够编写

var concatenated = from list in lists from item in list select item;

'lists' 是你的IEnumerable<List<string>>并且 concatenated 是 type IEnumerable<string>

(从技术上讲,这一个单一的方法调用SelectMany——它看起来并不是我在开场白中的全部意思。只是想澄清一下,以防有人感到困惑或发表评论——在我发布它之后我意识到可以读)。

于 2008-09-29T19:50:54.087 回答
0

做一个简单的方法。不需要 LINQ:

IEnumerable<string> GetStrings(IEnumerable<List<string>> lists)
{
   foreach (List<string> list in lists)
   foreach (string item in list)
   {
     yield return item;
   }
 }
于 2008-09-29T19:56:48.317 回答
0

使用 LINQ 表达式...

IEnumerable<string> myList = from a in (from b in myBigList
                                        select b)
                             select a;

...工作得很好。:-)

b将是一个IEnumerable<string>并且a将是一个string

于 2008-09-29T20:02:12.997 回答
0

这是另一个 LINQ 查询理解。

IEnumerable<string> myStrings =
  from a in mySource
  from b in a
  select b;
于 2008-09-29T20:10:36.863 回答