2016-05-16 60 views
0

我有功能轉換2個forloops到LINQ

private void TotalOutcome(List<Prenumerator> prenumerators, List<Publication> publications) 
    { 
     foreach (Publication publication in publications) 
     { 
      foreach (Prenumerator prenumerator in prenumerators) 
      { 
       if (prenumerator.PublicationCode == publication.Code) 
       { 
        publication.Earnings += prenumerator.Count * publication.MonthPrice; 
       } 
      } 
     } 
    } 

我怎樣才能將它轉換爲LINQ?我目前的做法是不行的,沒有做任何事情:

publications = (from publication in publications 
       from prenumerator in prenumerators 
       where prenumerator.PublicationCode == publication.Code 
       select publication); 
        { 
         publication.Earnings += prenumerator.Count * publication.MonthPrice; 

        } 
    ); 
+3

linq用於查詢數據,而不是修改數據 –

+0

如果您在匿名類中同時選擇'publication'和'prenumerator',您可以在ToList().ForEach()現在就離開它。 – juharr

+0

所以這是不可能的? –

回答

2

正如其他人所說,LINQ是不是更新操作的工具。你仍然可以做到這一點部分使用LINQ即用於計算部分,然後用普通的foreach循環的更新部分,例如:

foreach (Publication publication in publications) 
{ 
    var total = prenumerators.Where(o => o.PublicationCode == publication.PublicationCode) 
          .Sum(o => o.Count * publication.MonthPrice); 
    publication.Earnings += total; 
} 
1

您可以將第二循環轉換這樣

private static void TotalOutcome(List<Prenumerator> prenumerators, List<Publication> publications) 
     { 
      foreach (Publication publication in publications) 
      { 
       foreach (Prenumerator prenumerator in prenumerators.Where(prenumerator => prenumerator.PublicationCode == publication.Code)) 
       { 
        publication.Earnings += prenumerator.Count * publication.MonthPrice; 
       } 
      } 
     } 
1

只是要迂腐,並充分Linq(我認爲這是從森林阿甘的引用)。這是對har07代碼的「改進」;然而,根據你工作的編碼標準,有些地方可能不喜歡Linq的這種無償使用。

publications.ForEach(publication => 
    { 
     publication.Earnings = prenumerators 
         .Where(o => o.PublicationCode == publication.PublicationCode) 
         .Sum(o => o.Count * publication.MonthPrice); 
    }); 

實際上,我們有我們的店,你不能使用.ForEach如果你要授人以裏面的它比一個線長放的規則。

0

第一步,我們運用了一下協會的法律:

  var cnt = 0; 
     foreach (Prenumerator prenumerator in prenumerators) 
     { 
      if (prenumerator.PublicationCode == publication.Code) 
      { 
       cnt += prenumerator.Count; 
      } 
     } 
     publication.Earnings = cnt * publication.MonthPrice; 

這使得下一步更容易:

publication.Earnings = prenumerators 
         .Where(p=>p.PublicationCode == publication.Code) 
         .Aggregate(p=> p.Count)) * publication.MonthPrice; 

有沒有particularlly好辦法擺脫外環的。