根据类结构更改GroupBy键

时间:2015-05-12 16:07:52

标签: c# group-by

我有一个包含多列的项目列表,并希望根据布尔值将它们按某些字段分组:

我有以下课程:

public class Item
    {
        public string Group { get; set; }
        public string Person { get; set; }
        public string Currency { get; set; }
        public string Country { get; set; }
        public string County { get; set; }
        public string OtherAdd { get; set; }
        public string Income { get; set; }
    }

是List的一部分:

var results = items.ToList(); //items is IEnumerable<Item>

如果int type = 1,那么我想按更多元素进行分组:

results = results
                .GroupBy(e => new { e.Group, e.Person, e.Branch, e.Currency, e.Country, e.County, e.OtherAdd})
                .Select(g => new Item
                {
                    Group = g.Key.Group,
                    Person = g.Key.Person,
                    Currency = g.Key.Currency,
                    Currency = g.Key.Country,
                    Currency = g.Key.County,
                    Currency = g.Key.OtherAdd,
                    Income = g.Sum(p => double.Parse(p.Income, System.Globalization.CultureInfo.InvariantCulture)).ToString("0.00", System.Globalization.CultureInfo.InvariantCulture)
                })
                .ToList();

如果int type = 2,那么我想用更少的元素进行分组(例如,因为OtherAdd将是一个空字符串):

results = results
                .GroupBy(e => new { e.Group, e.Person, e.Branch, e.Currency})
                .Select(g => new Item
                {
                    Group = g.Key.Group,
                    Person = g.Key.Person,
                    Currency = g.Key.Currency,
                    Income = g.Sum(p => double.Parse(p.Income, System.Globalization.CultureInfo.InvariantCulture)).ToString("0.00", System.Globalization.CultureInfo.InvariantCulture)
                })
                .ToList();

有没有办法让我根据我的整数类型更改GroupBy键而不重复代码?

1 个答案:

答案 0 :(得分:0)

好吧,你可以使用旧的SQL技巧,条件值:

.GroupBy(e => new { e.Group, Person = (e.Type == 1 ? e.Person : Guid.NewGuid().ToString()), ... }

虽然这仍然包含group by中的列,但所有项都将具有唯一键,因此它并不重要。遗憾的是,我不认为有一种方法可以生成唯一的密钥,这与SQL(您只能使用NULL)不同。

更好的方法可能是实现自己的分组类,而不是使用匿名类型。然后,您可以使用自己的相等和散列语义,以确定是否包含所有字段。然而,这可能比仅重复使用相似的代码更有用。

或者,您可能想要修改整个设计。它听起来并不像你试图做的那样有意义 - 你已经非常怀疑你在两个不同的事情上使用相同的类型,并使用{{1}所有字段的s都没有帮助。也许你可以尝试不同的对象设计?