LINQ Learning-AggregateOperators、ConversionOperators等

AggregateOperators(聚合运算)   

     Distinct:去除重复。

    Count(n => n % 2 == 1):n除以2余1的个数

    Sum:加和。

    Sum(w => w.Length):字符串长度加和。

    Min(最小)、Max(最大)、Average(平均)

    Aggregate:将数组中的数依次进行运算。

    eg1:

       double[] doubles = { 1.7, 2.3, 1.9, 4.1, 2.9 };

       double product = doubles.Aggregate((a, b) => a * b);

      这个公式的意思是:1.7*2.3=>x*1.9=>x*4.1=>x*2.9=??,连起来就是 1.7*2.3*1.9*4.1*2.9=??

    eg2:

      double startBalance = 100.0;

      int[] attemptedWithdrawals = { 20, 10, 40, 50, 10, 70, 30 };      

      double endBalance =attemptedWithdrawals.Aggregate(startBalance,(a, b) =>((b <= a) ? (a - b) : a));

      这里相当于把100.00放到attemptedWithdrawals的第一位去运算。

      100>20? 100-20=80

      80>10? 80-10=70

      70>40? 70-40=30

      30>50?  30

      30>10? 30-10=20

      20>70? 20

      20>30? 20

ConversionOperators

     ToDictionary:将数据变成字典

     eg:

        var scoreRecords = new[] { new {Name = "Alice", Score = 50},
                                        new {Name = "Bob"  , Score = 40},
                                        new {Name = "Cathy", Score = 45}
                                    };
                var scoreRecordsDict = scoreRecords.ToDictionary(sr => sr.Name);

      

    OfType<T>:从数据中选择相应数据类型的数据。

    eg:object[] numbers = { null, 1.0, "two", 3, "four", 5, "six", 7.0 };

    var doubles = numbers.OfType<double>();     1  7

    var doubles = numbers.OfType<string>();       two  four  six

CustomSequenceOperators(用户自定义操作)

    Combine:

     eg:int NumberA={0,2,4,5,6,8,9}  int NumberB={1,3,5,7,8}

      int dotProduct = numbersA.Combine(numbersB, (a, b) => a.Field<int>("number") * b.Field<int>("number")).Sum();

      0*1+2*3+4*5+5*7+6*8+8*0+9*0=109      

public static IEnumerable<S> Combine<S>(this IEnumerable<DataRow> first, IEnumerable<DataRow> second, System.Func<DataRow, DataRow, S> func)
        {
            using (IEnumerator<DataRow> e1 = first.GetEnumerator(), e2 = second.GetEnumerator())
            {
                while (e1.MoveNext() && e2.MoveNext())
                {
                    yield return func(e1.Current, e2.Current);
                }
            }
        }

      MoveNext:是否有下一个元素

ElementOperators

    ElementAt(n):第n个数据对象。

GenerationOperators

    Enumerable.Range(100, 50)  从100开始 向后50个数,即从100到150

     Enumerable.Repeat(7, 10)    将7循环10次

MiscellaneousOperators

    Concat:

        int[] numbersA = { 0, 2, 4, 5, 6, 8, 9 };

        int[] numbersB = { 1, 3, 5, 7, 8 };

        var allNumbers = numbersA.Concat(numbersB);   { 0, 2, 4, 5, 6, 8, 9,1, 3, 5, 7, 8}

     SequenceEqual:元素的个数,顺序,每个元素是否都相等        

        var wordsA = new string[] { "cherry", "apple", "blueberry" };           

        var wordsB = new string[] { "cherry", "apple", "blueberry" };         var wordsB = new string[] { "apple", "blueberry", "cherry" };     

        bool match = wordsA.SequenceEqual(wordsB);     true            bool match = wordsA.SequenceEqual(wordsB);     false

OrderingOperators    

      eg1:先按长度排序,再按首字母排序        

          string[] digits = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };
                var sortedDigits =
                    from digit in digits
                    orderby digit.Length, digit
                    select digit;          
var sortedWords = words.OrderBy(a => a.Length)
                        .ThenBy(a => a, new CaseInsensitiveComparer());

     Reverse():将结果集 倒序。 

PartitioningOperators

    TakeWhile:不符合条件时就终止     

        int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };

        TakeWhile(n=>n<6)      5, 4, 1, 3

        Where(n=>n<6)           5, 4, 1, 3, 2, 0

      SkipWhile:符合条件时就停止跳过

        int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };

        SkipWhile(n => n % 3 != 0)   3, 9, 8, 6, 7, 2, 0 因为3符合了条件,后面的就都不跳过了

        

posted @ 2013-05-02 17:11  小飞的DD  阅读(169)  评论(0编辑  收藏  举报