2

必须做很多事情才能让 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 如预期的那样。我不能使用 Add(p) 它给 Generic List<> .Add 有一些无效的参数。

mPrivateClass1 is a:
 private List<MyClass1> mPrivateClass1 = new List<MyClass1>();

mPrivateClass2 is a:
 private List<MyClass2> mPrivateClass2 = new List<MyClass2>();
4

2 回答 2

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。这是您的代码的预期值和期望值。

要仅获取 2 个元素,mPrivateClass2您必须决定应该添加组中的哪个元素。例如,要仅添加每个组中的第一项,请使用以下内容:

mClass2.ForEach(p => mPrivateClass2.Add(p.First()));

您可以添加其他方法,例如,在获取一项之前OrderBy对内容进行排序:IGrouping

mClass2 .ForEach(p => mPrivateClass2.Add(p.OrderBy(x => Id).First()));
于 2013-11-23T00:21:02.833 回答
1

这是因为即使您在 中有 2 个组mClass2,也有 13 个元素组合在 2 个组中,您IEnumerable<MyClass2>在调用时将其添加为mPrivateClass2.AddRange

MyClass2您希望添加每组中的哪两个元素?

于 2013-11-23T00:22:16.577 回答