空白如何发生这种情况?

时间:2013-11-23 00:03:58

标签: c# linq linq-to-entities igrouping

必须做很多事情才能让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>();

2 个答案:

答案 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组中的哪两个元素?