C# 属性列表。需要根据2个条件对它们进行分组[重复]
Posted
技术标签:
【中文标题】C# 属性列表。需要根据2个条件对它们进行分组[重复]【英文标题】:C# List of properties. Need to group them based on 2 conditions [duplicate] 【发布时间】:2020-12-03 23:01:39 【问题描述】:我有一个数据库数据列表,其中 2 个属性对分组很重要。我去掉了不重要的属性,并创建了一个需要排序的数据列表。
不确定是否应该使用带有linq语句的算法的某些方法,然后如何最好地存储结果?
public class PaymentVouchers
public string PayFromBankAccountId get; set;
public int PaymentType get; set;
public decimal TotalPaymentAmount get; set;
数据:
var paymentVouchers = new List<PaymentVouchers>()
new PaymentVouchers PayFromBankAccountId = "ABC", PaymentType = 5,
new PaymentVouchers PayFromBankAccountId = "ABC", PaymentType = 5,
new PaymentVouchers PayFromBankAccountId = "ABC", PaymentType = 5,
new PaymentVouchers PayFromBankAccountId = "ABC", PaymentType = 6,
new PaymentVouchers PayFromBankAccountId = "ABC", PaymentType = 6,
new PaymentVouchers PayFromBankAccountId = "ABC", PaymentType = 6,
new PaymentVouchers PayFromBankAccountId = "DEF", PaymentType = 5,
new PaymentVouchers PayFromBankAccountId = "DEF", PaymentType = 5,
new PaymentVouchers PayFromBankAccountId = "DEF", PaymentType = 6,
new PaymentVouchers PayFromBankAccountId = "DEF", PaymentType = 6,
因此从数据来看,我需要将 ABC 和 5 组合在一起,因为其中有 3 个,然后将 ABC 和 6 组合在一起,偶然也有 3 个。然后在数据中看到 2 个其他组 DEF 和 5 - 2 和 DEF 和 6 ,其中有 2 个。
所以,如果我做了一个 foreach 循环,一个 linq 语句 - 我如何让它们不会因为将它们分组到什么类型的集合中而变得混乱?元组的哈希集?一些具有新属性的新列表,该属性是标识符 "key" 。性能理想
想法?
添加:更新:
我无法将列表中的数据放入新列表中
var paymentGroups = new List<PaymentGroups>();
paymentGroups = paymentVouchers.GroupBy(x => new x.PayFromBankAccountId, x.PaymentType )
.Select(x => new
x.Key.PayFromBankAccountId,
x.Key.PaymentType,
//x.Sum(PaymentType)
Sum = x.Sum(TotalPaymentAmount),
paymentGroups.TotalCount = x.Key.Count
);
paymentGroups.Dump();
公共类 PaymentGroups
public string PayFromBankAccountId get; set;
public int PaymentType get; set;
public decimal TotalAmounts get; set;
public int TotalCount get; set;
【问题讨论】:
【参考方案1】:使用ValueTuple
进行分组。很难与它的性能特征竞争。请注意,LINQ
不适合性能。
List<(string Group, int Total, int Amount)> data = paymentVouchers
.GroupBy(v => (v.PayFromBankAccountId, v.PaymentType))
.Select(g => (g.Key, Vouchers: g.ToList()))
.Select(t => (Group: $"t.Key.PayFromBankAccountId|t.Key.PaymentType", Total: t.Vouchers.Count, Amount: t.Vouchers.Sum(x => x.PaymentType)))
.ToList();
【讨论】:
我添加到我的问题中。我有一个列表,我想用它来存储包含总计数、总金额和其他值的组。我怎样才能做到这一点?所以 var Groups - 说这被设置为我想与组结果水合的新 List PaymentGroups? 我相信您正在寻找g.ToList()
。它有点隐蔽。请尝试上面的新代码。这是一个好的开始。
我明白了,所以我可以让我的新列表动态替换它 List "data" ...【参考方案2】:
您可以像这样在 group by 上使用 2 个属性:
paymentVouchers.GroupBy(x => new x.PayFromBankAccountId, x.PaymentType ).Select(x => new
x.Key.PayFromBankAccountId,
x.Key.PaymentType,
x.Sum(/*Something*/)
// REST
)
编辑:
paymentGroups = paymentVouchers.GroupBy(x => new x.PayFromBankAccountId, x.PaymentType )
.Select(x => new
x.Key.PayFromBankAccountId,
x.Key.PaymentType,
TotalAmounts = x.Sum(TotalPaymentAmount),
TotalCount = x.Count()
);
这将返回一个按 2 个键分组的列表,以及它们的值和每个组的 TotalPaymentAmount 总和以及每个组的计数。
如果你想放入你定义的类,那么:
paymentGroups = paymentVouchers.GroupBy(x => new x.PayFromBankAccountId, x.PaymentType )
.Select(x => new PaymentGroups
PayFromBankAccountId = x.Key.PayFromBankAccountId,
PaymentType = x.Key.PaymentType,
TotalAmounts = x.Sum(TotalPaymentAmount),
TotalCount = x.Count()
);
【讨论】:
确实将它们分组,谢谢。但是 - 我怎么能将它们存储到某个集合中,然后我会知道每个集合的数量,然后是的,第三个属性最终会显示一个 $ 金额,我可以在其中知道每个分组的总数。目前,如果我将 Linq 语句设置为 var blah = 您的代码,则该 Linq 语句会吐出不同的组 - 但是我如何计算有多少然后将其放在某个集合中? 哦,我看到了 Sum ... 嗯,所以如果我创建了一些新列表来保存事物值 ... 如果你想要集合中的计数。您可以使用 Count = x.Count() 更改 x.Sum(/*something*/) 或者对于集合的总和,您可以执行“Sum = x.Sum(TotalPaymentAmount)” 我在问题中添加了一个带有属性的新类,我正在尝试了解如何将数据泵入该列表 - 请注意我正在使用您的语句,但在 Sum 和匹配方面遇到了问题关于不同类型和匿名类型等。以上是关于C# 属性列表。需要根据2个条件对它们进行分组[重复]的主要内容,如果未能解决你的问题,请参考以下文章