在 C# 中使用 LINQ 创建仅包含唯一值的数据表

问题描述 投票:0回答:2

我有一个数据表

dt_Candidates

      Candidate      |   First Name   |   Last Name   
 --------------------|----------------|--------------- 
  John, Kennedy      | John           | Kennedy       
  Richard, Nixon     | Richard        | Nixon         
  Eleanor, Roosevelt | Eleanor        | Roosevelt     
  Jack, Black        | Jack           | Black         
  Richard, Nixon     | Richard        | Nixon         

我想创建一个新的 DataTable,其中包含 ONLY 唯一值(基于

Candidate
列),如下所示,称为
dt_Candidates2
,没有嵌套循环,最好使用 LINQ。

      Candidate      |   First Name   |   Last Name   
 --------------------|----------------|--------------- 
  John, Kennedy      | John           | Kennedy       
  Eleanor, Roosevelt | Eleanor        | Roosevelt     
  Jack, Black        | Jack           | Black         

同时,创建一个名为

RejectedCandidates
的列表或数组,其中包含不同的重复项

RejectedCandidates = {"Richard, Nixon"}
c# linq datatable
2个回答
1
投票

如上所述,我认为这里并不真正需要 LINQ。它可以是这样的:

DataTable dt = new DataTable();
dt.Columns.Add("Candidate");
dt.Columns.Add("First");
dt.Columns.Add("Last");
dt.PrimaryKey = new []{ dt.Columns["Candidate"] }; //means that dt.Find() will work

while(...){
  string candidate = ...

  if(dt.Rows.Find(candidate) != null)
    RejectList.Add(...);
  else
    dt.Rows.Add(...);
}

避免在 DataTable 上使用 LINQ 的

.Any
。这不仅是一个痛苦的开始,因为它需要转换步骤或扩展库(参见这里),然后它会使用循环来查找您想要的信息; PrimaryKey 的内置机制使用哈希表来实现更快的查找。


0
投票
var dt = new DataTable
{
    Columns = {"Candidate", "First Name", "Last Name"},
    Rows = 
    {
        new object [] { "John, Kennedy", "John", "Kennedy"},
        new object [] { "Richard, Nixon", "Richard", "Nixon"},
        new object [] { "Eleanor, Roosevelt", "Eleanor", "Roosevelt"},
        new object [] { "Jack, Black", "Jack", "Black"},
        new object [] { "Richard, Nixon", "Richard", "Nixon"},
    }
};

您可以使用分组(groupBy)来查找重复项,过滤掉它们,然后使用 DataTableExtensions.CopyToDataTable 扩展方法创建一个新的 DataTable:

var dt2 = dt.AsEnumerable()

            .GroupBy(r => r["Candidate"])
            .Where(g => g.Count() == 1)

            .Select(g => g.First())
            .CopyToDataTable();
© www.soinside.com 2019 - 2024. All rights reserved.