选择许多Linq

莫海达尔

谁能解释这个SelectMany语法

List<string> animals = new List<string>() { "cat", "dog", "donkey" };
List<int> number = new List<int>() { 10, 20 };
var mix=number.SelectMany(num => animals, (n, a) => new { n, a });

我不熟悉该语法,因为我习惯于将其用于拼合(拼合列表中的列表)

 public class x
 {
     public List<z> Zs{get; set;}
     public int Y { get; set; }
 }
 public class z
 {
     public int Y { get; set; }
 }
    List<x> Xs = new List<x>();
    Xs.Add(new x() { Zs = new List<z>() { new z() { Y = 15 } } });
    Xs.Add(new x() { Zs = new List<z>() { new z() { Y = 17 } } });
    Xs.Add(new x() { Zs = new List<z>() { new z() { Y = 19 } } });
    Xs.Add(new x() { Zs = new List<z>() { new z() { Y = 25 } } });
    Xs.Add(new x() { Zs = new List<z>() { new z() { Y = 50 } } });

Xs.SelectMany(x => x.Zs).Sum(z => z.Y);
柬埔寨Mrinal

此处检查来自Microsoft的参考源

以下是SelectMany正在利用过载

        public static IEnumerable<TResult> SelectMany<TSource, TCollection, TResult>(this IEnumerable<TSource> source, Func<TSource, IEnumerable<TCollection>> collectionSelector, Func<TSource, TCollection, TResult> resultSelector) 
        {
            if (source == null) throw Error.ArgumentNull("source");
            if (collectionSelector == null) throw Error.ArgumentNull("collectionSelector");
            if (resultSelector == null) throw Error.ArgumentNull("resultSelector");
            return SelectManyIterator<TSource, TCollection, TResult>(source, collectionSelector, resultSelector);
        }

        static IEnumerable<TResult> SelectManyIterator<TSource, TCollection, TResult>(IEnumerable<TSource> source, Func<TSource, IEnumerable<TCollection>> collectionSelector, Func<TSource, TCollection, TResult> resultSelector) 
        {
            foreach (TSource element in source) 
            {
                foreach (TCollection subElement in collectionSelector(element)) 
                {
                    yield return resultSelector(element, subElement);
                }
            }
        }

如何工作的(这也是数据展平的形式)

  1. 类似于同心for / foreach循环,遍历两个集合并创建一个组合列表,其复杂度为O(N ^ 2)
  2. 首先,我们提供数字列表作为 IEnumerable<TSource>
  3. 添加一个Func,number我们为每个Func提供animal列表
  4. 最后,将结果作为组合的匿名集合,将每个动物添加到一个数字中,结果就像

      n    a
    
      10   cat 
      10   dog 
      10   donkey 
      20   cat 
      20   dog 
      20   donkey 
    

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章