LINQ如何检索匿名属性

时间:2015-04-23 19:03:59

标签: c# linq

我有一个整数数组。我可以GroupBySortTake重复较少的元素:

int [] list = new int[] {0, 1, 1, 0, 2};
var result = list
    .GroupBy(a => a)
    .Select(g => new {
        Number = g.Key,
        Total = g.Count()
    })
    .OrderBy(g => g.Total).Take(1);

foreach内我可以检索结果,我甚至还有群组属性的智能感知{Number, Total}

foreach (var group in result)
{
    // Display key and its values.
    Console.WriteLine("Number = {0} Total: {1}", group.Number, group.Total);
}

但是我不想做foreach这样做,我更喜欢做

之类的事情
result.Number or 
result[0].Number

但是不起作用。应该采取什么样的正确方法?

4 个答案:

答案 0 :(得分:2)

您使用的Take(1)仍会返回IEnumerable。您可能希望使用不返回IEnumerable的FirstOrDefault()

.OrderBy(g => g.Total).Take(1);

然后您可以像result.Numberresult.Total一样使用它。

答案 1 :(得分:2)

您的问题是Take返回IEnumerable,因此如果您只想获取第一个元素,那么请使用FirstOrDefault: -

var result = list.GroupBy(a => a)
                        .Select(g => new
                        {
                            Number = g.Key,
                            Total = g.Count()
                        })
                        .OrderBy(g => g.Total).FirstOrDefault();

然后,您可以简单地说: - result.Number。请注意FirstOrDefault可能会返回null,因此请在访问任何属性之前检查空值,否则可能会获得Null Reference Exception

此外,如果您正在寻找任何特定索引,那么您可以使用ElementAtOrDefault,如下所示: -

var result = list.GroupBy(.....)..OrderBy(g => g.Total);
int SecondNumber = result.result.ElementAtOrDefault(1).Number;

但请再次注意NRE

答案 2 :(得分:1)

匿名类型未实现IEnumerable<T>,因为您无法通过索引访问它。

如果您只想要第一个对象,则可以使用First()FirstOrDefault。如果将其强制转换为数组,则可以使用索引,然后再次支持您的属性:

result.FirstOrDefault().Number;
result.ToArray()[1].Number;

enter image description here

答案 3 :(得分:1)

检查以下方法:

.FirstOrDefault(); //gets the first element
.Take(n); //gets the first n elements
.Skip(n).FirstOrDefault(); //gets the (n+1)th element
.Skip(n).Take(m); //gets the first m elements after n elements