查找列表中的最大值

时间:2013-12-19 12:09:39

标签: linq c#-4.0

我有一些看起来像这样的代码

public int getMobID()
{
    int maxMobID = 0;

    foreach (Farm f in subscription.Farms)
    {
        foreach (Paddock p in f.Paddocks)
        {
            foreach (AnimalMob m in p.Mobs)
            {
                if (m.AnimalMobID >= maxMobID)
                {
                    maxMobID = m.AnimalMobID + 1;
                }
            }
        }
    }
    return maxMobID;
}

我认为使用LINQ可能会更快,但我不确定它会是什么样子,确实如果可以的话。

对此有任何建议将不胜感激。

3 个答案:

答案 0 :(得分:4)

  

我认为可能会更快

LINQ通常不会更快,但更多可读,因为它也使用循环。

var animalMobIDs = from farm in subscription.Farms
                   from paddock in farm.Paddocks
                   from mob in paddock.Mobs
                   select mob.AnimalMobID;
int maxMobID = 0;
if(animalMobIDs.Any())
    maxMobID = animalMobIDs.Max() + 1;

顺便说一句,这是Enumerable.SelectMany的查询版本,我发现它比方法语法更具可读性(同样适用于Enumerable.Join imho)。

答案 1 :(得分:3)

我认为这个LINQ查询在性能和可读性方面都足够了:

subscription.Farms.SelectMany(f => f.Paddocks)
                  .SelectMany(p => p.Mobs)
                  .DefaultIfEmpty(-1)
                  .Max(m => m.AnimalMobID + 1);

答案 2 :(得分:2)

使用SelectMany将它们投影到一个列表中,然后并行化所有内容。类似的东西:

subscription.Farms.AsParallel().SelectMany(x => 
          (x.Paddocks.SelectMany(
              y => y.Mobs.Select(j => j.AnimalMobId))).Max();

请注意,如果您使用此并行版本,则只能获得性能。否则LINQ肯定会慢一些。