2015-08-28 81 views
-3

我編寫了一個代碼,並使用LINQ來獲得顯示偶數和奇數和的樂趣。我的代碼運行良好,但我覺得我可以做得比這更好LINQ中的C#新表達式

點擊here圖像。

 static void Main(string[] args) 
    { 

     Func<int, int, IEnumerable<int>> NumberRange = 
      (startPoint, endPoint) => 
      Enumerable 
      .Range(Math.Min(startPoint, endPoint), Math.Abs(startPoint - endPoint) + 1); 

     Func<double, double, bool> IsDivisible = 
      (value, divisor) => 
       (value % divisor) 
       .Equals(0); 

     Action<IEnumerable<object>> DisplayItems = 
      (data) => 
      { 
       Console 
        .WriteLine(String.Join(Environment.NewLine, data.Select(n => n))); 
      }; 

     Func<bool, string> GetState = 
      (key) => 
       key.Equals(true) ? "even" : "odd"; 

     var query = 
      NumberRange(1, 20) 
       .GroupBy(item => IsDivisible(item, 2)) 
       .Select(group => new 
       { 
        Type = GetState(group.Key), 
        Sum = group.Sum() 
       }) 
       .Select(group => new 
       { 
        Output = string.Format("Sum of {0} numbers is {1}", group.Type, group.Sum) 
       } 
       .Output 
       ); 

     DisplayItems(query); 

     Console 
      .Read(); 

    } 

對新表達式有任何優化嗎?謝謝。

+0

我想簡單的循環(或簡單的效用函數)會比這更readible。這讓我摔倒了*「看,我可以寫linq」* – Eser

+0

int odds = 0; int evens = 0; foreach(Enumerable.Range(1,20)中的var val)if(val%2 == 0)evens + = val;否則賠率+ = val;同Eser一樣,Linq在性能方面可能會很危險,明智地使用它。 – Gusman

+0

而不是做這些funcs,把所有這些東西放入適當的擴展方法或東西。 –

回答

1

試試這個,這是簡單的:

static void Main(string[] args) 
    { 

     int startPoint = 0, endPoint = 20; 

     List<int> data = new List<int>(); 
     int i = startPoint; 
     while (i <= endPoint) 
     { 
      data.Add(i); 
      i++; 
     } 
     Console.WriteLine(string.Format("Sum of even numbers is {0} \r\n", data.Where(x => x % 2 == 0).Sum().ToString())); 

     Console.WriteLine(string.Format("Sum of odd numbers is {0} \r\n", data.Where(x => x % 2 != 0).Sum().ToString())); 

     Console.ReadLine(); 
    } 
+0

我以爲.GroupBy速度更快,因爲您正在檢查兩次數字。它可以減慢速度。 – Artxzta