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个条件对它们进行分组[重复]的主要内容,如果未能解决你的问题,请参考以下文章

根据 3 到 4 个条件对数据库表中的行进行计数和分组查询

C#按以下值对排序列表进行分组

根据2个(理想情况下推广到n个)任意分组规则对字母字符串列表进行聚类?

如何根据条件对sql中的行进行分组

按条件分组和计数

在sql中使用case语句根据某些条件对列进行分组