c# - 避免 LINQ 中的重复

标签 c# linq

我有一个如下所示的场景。事实上我得到了预期的结果。但需要避免在一个字段中重复。

我有一个自定义类来显示报告中的记录。类如下:

public class MyData
{
    public int ID;

    public string InvoiceNumber;

    public string DeliveryNoteNumber;

    public string QuotationNumber;
}

这里的流程是 1. 报价详情 2. 交货详情。一张交货单可以是多个报价单 3. 发票详细信息。这里一张发票可以有多个送货单。

因此,当我的发票报告时,我需要显示该发票的所有送货单,需要显示在以逗号分隔的标签中。就像所有引文一样,需要用逗号分隔显示。

这里我有一个问题。我在一张交货单中包含多个报价单,并将该交货单添加到一张发票​​中。因此,在报告中,我可以显示用逗号分隔的报价,但交货单也重复。我使用 Group Join 对数据进行分组,代码和示例如下

List<MyData> data = new List<MyData>();

MyData d1 = new MyData();
d1.ID = 1;
d1.InvoiceNumber = "Inv001";
d1.DeliveryNoteNumber = "DN001";
d1.QuotationNumber = "Q001";
data.Add(d1);

MyData d2 = new MyData();
d2.ID = 1;
d2.InvoiceNumber = "Inv001";
d2.DeliveryNoteNumber = "DN001";
d2.QuotationNumber = "Q002";
data.Add(d2);

var source = data.GroupBy(i => new { i.ID, i.InvoiceNumber })
       .Select(g => new MyData
       {
           ID = g.First().ID,
           InvoiceNumber = g.Key.InvoiceNumber,
           DeliveryNoteNumber = string.Join(", ", g.Select(i => i.DeliveryNoteNumber)),
           QuotationNumber = string.Join(", ", g.Select(i => i.QuotationNumber)),
       });

label1.Text = source.FirstOrDefault().DeliveryNoteNumber;
label2.Text = source.FirstOrDefault().QuotationNumber;

文本框中的输出如下:

Text1Result  = DN001, DN001
Text2Result  = Q001, Q002

这里第一个文本框是问题所在。请给出解决这个问题的想法。或者我需要更改存储过程来适应这一点。我的自定义类 (MyData) 是从 sp 填充的(例如,这里我只是硬编码)。使用联接报价表、交货单表和发票表创建的 sp

最佳答案

您可以在 LINQ 中使用 Distinct() 避免重复。

var source = data.GroupBy(i => new { i.ID, i.InvoiceNumber })
           .Select(g => new MyData
           {
               ID = g.First().ID,
               InvoiceNumber = g.Key.InvoiceNumber,
               DeliveryNoteNumber = string.Join(", ", g.Select(i => i.DeliveryNoteNumber).Distinct()),
               QuotationNumber = string.Join(", ", g.Select(i => i.QuotationNumber).Distinct()),
           });

关于c# - 避免 LINQ 中的重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21807339/

相关文章:

c# - 索引器 - 显式接口(interface)成员实现

c# - 使用 <T> 时在 LINQ 查询中使用实体属性,可能吗?

c# - 将数组拆分为特定长度的子数组

c# - 如何通过 C# 代码运行 powercfg 的功能?

c# - Linq 表达式返回第一个采用 1 个字符串参数的重载方法

c# - MySQL 表名作为参数

.net - 空值不能分配给 Int32 类型的成员,但字符串可以

c# - 正确的 Join/GroupJoin 实现

c# - 如何确定 XElement.Elements() 是否包含具有特定名称的节点?

c# - Entity Framework 4.1 幽灵列