可笑的简单问题,对于我的生活,我无法弄清楚。如何“获取”GroupBy返回的值?
以下简单示例。我想打印出不止一次出现的第一个值。查看观察窗口中的输出(如下图所示),它表明list3 [0] [0]可能达到“1”。但它给了我一个错误。
注意,我正在寻找一般解决方案 - 即了解GroupBy返回的内容。
另外,我想使用监视窗口来帮助我弄清楚我将如何访问变量(因为我发现许多MSDN参考难以理解) - 这可能吗?
var list1 = new List<String>() {
"one", "two", "three", "one", "two"};
var list3 = list1
.GroupBy(x => x)
.Where(x => x.Count() > 1)
.ToList();
Console.WriteLine("list3[0][0]=" + list3[0][0]); //error
答案 0 :(得分:1)
您正在寻找.Key
属性,因为GroupBy
会返回包含IGrouping
elements的IEnumerable。
答案 1 :(得分:1)
GroupBy
返回IEnumerable<IGrouping<TKey, TSource>>
,其中每个IGrouping<TKey, TElement>
对象包含一系列对象,而一个键不是 Multidimensional Array
,可以访问按索引 [][]
。
要访问第一个元素,请尝试此
static void Main(string[] args)
{
var list1 = new List<String>() {
"one", "two", "three", "one", "two"};
var list3 = list1
.GroupBy(x => x)
.Where(x => x.Count() > 1)
.ToList();
Console.WriteLine("list3[0][0]=" + list3[0].ToList()[0].ToString());
//OR Console.WriteLine("list3[0][0]=" + list3[0].First());
}
答案 2 :(得分:1)
虽然VS调试器显示“索引”编号,因为基础类型是集合,但分组将公开为没有索引器的IGrouping<T>
。如果只是想要第一个组中的第一个项目:
Console.WriteLine("list3[0][0] =" + list3.First().First());
如果您希望看到 all ,那么您可以通过分组循环:
int gi = 0, ii = 0;
foreach(var g in list3)
{
foreach(item i in g)
{
Console.WriteLine("list3[{0}][{1}] = {2}", gi, ii, i);
ii++;
}
gi++;
}
答案 3 :(得分:1)
如果您查看documentation of GroupBy
,您会看到它会返回IEnumerable<IGrouping<TKey, TSource>>
。
IGrouping<TKey,TSource>
有一个属性Key
,它本身会继承IEnumerable<TElement>
。
因此,您可以枚举从GroupBy调用返回的项目列表,并且每个元素将具有Key
属性(这是您分组的任何内容)以及枚举每个项目(将是列表组合在一起的项目)
希望这表明更清楚一点。给出一个类:
public class Person
{
public string Name{get;set;}
public int Age{get;set;}
}
列表:
var people = new List<Person>{
new Person{Name="Jamie",Age=35},
new Person{Name="Bob",Age=45},
new Person{Name="Fred",Age=35},
};
分组和枚举如下:
var groupedByAge = people.GroupBy(x => x.Age);
foreach(var item in groupedByAge)
{
Console.WriteLine("Age:{0}", item.Key);
foreach(var person in item)
{
Console.WriteLine("{0}",person.Name);
}
}
给出这个输出:
年龄:35个
杰米
弗雷德
年龄:45个
鲍勃