我有一个整数数组。我可以GroupBy
,Sort
和Take
重复较少的元素:
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
但是不起作用。应该采取什么样的正确方法?
答案 0 :(得分:2)
您使用的Take(1)
仍会返回IEnumerable
。您可能希望使用不返回IEnumerable的FirstOrDefault()
。
.OrderBy(g => g.Total).Take(1);
然后您可以像result.Number
和result.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;
答案 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