使用Linq查找具有最大长度的数组

时间:2014-03-17 00:17:08

标签: c# linq

我需要在数组列表中找到最大的数组。 使用基本技术,我可以做到这一点

        List<int[]> intArrayList;
        ...
        int largestArrayIndex = 0;
        for (int i = 1; i < intArrayList.Count; i++)
        {
            if (intArrayList[largestArrayIndex].Length < 
                intArrayList[i].Length)
            {
                largestArrayIndex = i;
            }
        }

但是,我很好奇是否有更简洁的方法与Linq这样做? 并且,这两者之间会有任何性能差异吗?

编辑:我想要最大的数组。所以,如果我有一个{int [5],int [7],int [9],int [3]的列表,我想要int [9]数组的索引或引用。

感谢。

3 个答案:

答案 0 :(得分:5)

你可以这样做:

var longest = intArrayList.Aggregate((i1,i2) => i1.Length > i2.Length ? i1 : i2);

性能方面,它只会迭代列表一次,所以我说它与你的代码几乎相同。

编辑:只是想说明我的代码返回的是最长的数组,而不是最长的数组。

干杯

答案 1 :(得分:3)

另一种方式:

int[] longestArray =  intArrayList.OrderBy(x => x.Length).Last();

返回最长的数组。如果需要最长数组的索引,则:

int index = intArrayList.Select((x,i) => new {Length = x.Length, Index = i}).OrderBy(x => x.Length).Last().Index;

答案 2 :(得分:1)

我相信原来的方法很好。以下代码应该这样做:

int maxLen = int.MinValue;
int maxLenIndex = intArrayList.SelectMany((array, index) => array.Length > maxLen && ((maxLen = array.Length) > int.MinValue) ? new[] { index } : new int[0]).Last();