使用Linq排序List后遍历var

时间:2013-10-31 16:47:45

标签: linq traversal var

我有一个类info_gain的对象列表。看起来像这样:(像结构一样使用它):

class info_gain 
        {
            public string words;
            public double ig;
        };

List <info_gain> InfoGain = new List<info_gain>(); 

现在我想按照属性ig的降序对这个列表中的对象进行排序。 我用过的是

var result = from element in InfoGain
                    orderby element.ig descending
                          select element;

现在我应该如何在for循环中遍历此var结果中的每个对象?

注意:我之前从未使用过Linq,因此排序语句可能不正确。

3 个答案:

答案 0 :(得分:4)

您应该使用foreach代替for

foreach(var item in result)
{
    // use item here
}

或者,如果您确实需要使用for,则可以先调用ToArray,以获取数组而不是IEnumerable

var resultArray = result.ToArray();
for(int i = 0; i < resultArray.Length; i++)
{
    var item = resultArray[i];
    // use item here
}

但我会选择foreach

更新

要仅使用X扩展方法遍历集合中的Take个第一项:

foreach(var item in result.Take(5))
{
    // use item here
}

答案 1 :(得分:3)

使用foreach循环遍历LINQ查询的结果:

foreach(var info in result)
  // use info.words or info.ig

BTW你可以使用lambda语法使你的查询更紧凑:

var result = InfoGain.OrderByDescending(element => element.ig);

要仅获取前几个元素,请使用Take运算符:

var result = InfoGain.OrderByDescending(element => element.ig).Take(5);

此外,您始终可以将查询结果放入新列表中,并与其他任何列表一起使用:

var gains = InfoGain.OrderByDescending(element => element.ig).ToList();

答案 2 :(得分:0)

var result =
    from element in InfoGain
    orderby element.ig descending
    select element;

foreach (var element in result)
{
    //stuff
}

或者,更简洁,

foreach (var element in InfoGain.OrderByDescending(element => element.ig))
{
    //stuff
}

然而,Linq的好处是你通常不需要显式迭代。你会在循环体中做什么?可以使用Linq方法消除显式迭代。