必须做很多事情才能让IGrouping在MVC4中工作c#。以下是我的疑问
var a = (from r in db.SomeProcedure(Id)
select new MyClass1
{
Id= r.Id,
Title = r.Title,
Name = r.Name,
Number = r.Number,
Product = r.Product,
OtherId = r,OtherId
}).ToList();
//上面按预期返回13个结果
var b = a.GroupBy(x => x.Title ?? "unknown", c => new MyClass2
{
Title2 = c.Title,
Id2 = c.Id,
OtherId2 = c.OtherId,
Number2 = c.Number
});
//上面按预期返回2
List<MyClass1> mClass1 = a;
List<IGrouping<string,MyClass2>> mClass2 = b.ToList();
//上面的2与预期相同
最后
mPrivateClass1.Clear();
mClass1 .ForEach(o => mPrivateClass1.Add(o));
//以上是预期的13
mPrivateClass2.Clear();
mClass2 .ForEach(p => mPrivateClass2.AddRange(p));
//以上是按预期返回13而不是2。我无法使用添加(p)它给出通用列表&lt;&gt; .Add有一些无效的论点。
mPrivateClass1 is a:
private List<MyClass1> mPrivateClass1 = new List<MyClass1>();
mPrivateClass2 is a:
private List<MyClass2> mPrivateClass2 = new List<MyClass2>();
答案 0 :(得分:1)
mPrivateClass2.Clear();
mClass2 .ForEach(p => mPrivateClass2.AddRange(p));
//The above is returning 13 not 2 as expected.
为什么你希望它只返回2个元素?由于您使用的是AddRange
,因此整个分组内容会添加到您的List
中,并且因为IGrouping<TKey, TElement>
实施IEnumerable<TElement>
所有元素都归类到该组,您将获得13.这是您的代码的预期和期望值。
要获得mPrivateClass2
中只有2个元素,您必须决定,应该添加该组中的哪个元素。例如,要仅添加每个组中的第一个项目,请使用以下内容:
mClass2.ForEach(p => mPrivateClass2.Add(p.First()));
您可以添加其他方法,例如OrderBy
,以便在获取一个项目之前对IGrouping
内容进行排序:
mClass2 .ForEach(p => mPrivateClass2.Add(p.OrderBy(x => Id).First()));
答案 1 :(得分:1)
这是因为即使您在mClass2
中有2个组,但您在2个组中共有13个元素,当您调用IEnumerable<MyClass2>
时,您将添加为mPrivateClass2.AddRange
。< / p>
您希望添加每个MyClass2
组中的哪两个元素?