【问题标题】:How to remove duplicate property from a list in C#如何从 C# 中的列表中删除重复的属性
【发布时间】:2023-04-04 12:59:01
【问题描述】:

您好,我有一个控制台应用程序,我必须使用它从几个表中获取数据并从中创建一个 excel 文件,这是我的代码

 var Result = (from a in Db.tbl_ApplicantMaster
    join b in Db.tbl_App_Process on a.APP_ID equals b.APID
    join c in Db.tbl_Process on b.ProcessID equals c.ID
    join d in Db.tbl_Nationality on a.Nationality equals d.country_code
    join e in Db.tbl_AgencyMaster on a.Agn_ID equals e.AgID
    select new ExcelData
    {
        Name = a.Name,
        AppId = a.APP_ID,
        ProcessName = c.Process,
        StartDate = b.StartTime.ToString(),
        EndDate = b.EndTime.ToString(),
        Nationality = d.country_enName,
        Agency = e.AgencyName,
        }).ToList();
                
var File = new FileInfo(@"C:\path\ExcelSheet.xlsx");
              
await  GetExcelFile.ExportDataToExcel(Result, File);

这是我用来创建 Excel 文件的代码

 public static async Task ExportDataToExcel(List <ExcelData>  data,FileInfo File)
        {
           

            try
            {
               

                DeleteIfExists(File);
                ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
                using (var Package =new ExcelPackage(File))
                {

                    var Ws = Package.Workbook.Worksheets.Add(Name: "MainReport");
                    var range = Ws.Cells[Address: "A1"].LoadFromCollection(data, true);
                    range.AutoFitColumns();

                    await Package.SaveAsync();

                }
               
               
            }
            catch (Exception)
            {
                
                throw;
            }
        }

这是我的模特

 public class ExcelData{
        public int AppId { get; set; }
        public string Name { get; set; }
        public string ProcessName { get; set; }
        public string StartDate { get; set; }
        public string EndDate { get; set; }
        public string Nationality { get; set; }
        public string Agency { get; set; }
        public double No_of_Days { get; set; }

    }

有了这个,我可以获取所需的数据,甚至可以从中创建一个 excel 表,但是 excel 表需要采用特定的模式,其中只应显示申请人姓名,然后是每个流程的日期和名称,每个申请人有16个流程,所以每列与流程重复相同的名称不好,当前数据如下

ApplicantID:111
Name: X
ProcessName:Licence
startDate:10-10-2021
EndDate: 20-10-2021

ApplicantID:111
Name:x
ProcessName:TOIEC Test
start date:10-10-2021
End Date: 20-10-2021

ApplicantID:111
Name:x
ProcessName:Physical Test
start date:10-10-2021
End Date: 20-10-2021

但我希望它像

ApplicantID:111
Name: X

ProcessName:Licence
startDate:10-10-2021
EndDate: 20-10-2021

ProcessName:TOIEC Test
start date:10-10-2021
End Date: 20-10-2021

ProcessName:Physical Test
start date:10-10-2021
End Date: 20-10-2021

如何在 C# 中实现这一点?我必须为此使用任何第三方库吗?请帮帮我,谢谢

【问题讨论】:

  • 这取决于您如何从中创建 excel 文件。无论您是在循环语句中将行添加到 Excel 工作表,还是调用需要准备好的行数据集合的导出函数,解决方案都会有所不同。请告诉我们您是如何导出到 excel 的。
  • @OlivierJacot-Descombes 感谢您抽出宝贵时间回答我的问题,我已经编辑了帖子并提供了更多详细信息。请再次检查,如果您有任何解决方案,请回复。

标签: c# asp.net-mvc linq console


【解决方案1】:

更改ExcelData 类并使AppIdName 可以为空(因为Name 是一个字符串,只有在使用可以为空的引用类型时才需要这样做)。

然后在您的查询中添加orderby 并按a.APP_ID 对项目进行排序:

var Result = (from a in Db.tbl_ApplicantMaster
    join b in Db.tbl_App_Process on a.APP_ID equals b.APID
    join c in Db.tbl_Process on b.ProcessID equals c.ID
    join d in Db.tbl_Nationality on a.Nationality equals d.country_code
    join e in Db.tbl_AgencyMaster on a.Agn_ID equals e.AgID
    orderby a.APP_ID
    select new ExcelData {
        Name = a.Name,
        AppId = a.APP_ID,
        ProcessName = c.Process,
        StartDate = b.StartTime.ToString(),
        EndDate = b.EndTime.ToString(),
        Nationality = d.country_enName,
        Agency = e.AgencyName,
    }).ToList();

现在您可以处理excel数据列表并将重复的AppIdName设置为null:

int? lastAppId = null;
foreach (var item in Result) {
    if (item.AppId == lastAppId) {
        item.AppId = null;
        item.Name = null;
    } else {
        lastAppId = item.AppId;
    }
}

这可能并不完美,但由于我们必须将单一类型的元素传递给LoadFromCollection,所以我们受到了一些限制。我不知道将null 项目插入列表是否有效。如果 Excel 插入空行,这将有助于进行一些分组。像这样:

for (int i = Result.Count - 1; i >= 0; i--) {
    var item = Result[i];
    if (item.AppId == lastAppId) {
        item.AppId = null;
        item.Name = null;
    } else {
        lastAppId = item.AppId;
        Result.Insert(i, null);
    }
}

请注意,这会以相反的顺序循环列表,因此插入空条目不会更改尚未处理的项目的索引。

【讨论】:

  • 非常感谢,有了这个我可以删除重复的名称和ID,现在我只需要弄清楚如何在一行中打印相关数据。
猜你喜欢
  • 1970-01-01
  • 2022-01-12
  • 2011-09-30
  • 2011-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多