2016-05-16 45 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好办法摆脱外环的。