我有一个包含多列的项目列表,并希望根据布尔值将它们按某些字段分组:
我有以下课程:
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键而不重复代码?
答案 0 :(得分:0)
好吧,你可以使用旧的SQL技巧,条件值:
.GroupBy(e => new { e.Group, Person = (e.Type == 1 ? e.Person : Guid.NewGuid().ToString()), ... }
虽然这仍然包含group by中的列,但所有项都将具有唯一键,因此它并不重要。遗憾的是,我不认为有一种方法可以生成唯一的密钥,这与SQL(您只能使用NULL
)不同。
更好的方法可能是实现自己的分组类,而不是使用匿名类型。然后,您可以使用自己的相等和散列语义,以确定是否包含所有字段。然而,这可能比仅重复使用相似的代码更有用。
或者,您可能想要修改整个设计。它听起来并不像你试图做的那样有意义 - 你已经非常怀疑你在两个不同的事情上使用相同的类型,并使用{{1}所有字段的s都没有帮助。也许你可以尝试不同的对象设计?