用C#中的Linq创建一个只包含唯一值的DataTable



我有一个DataTabledt_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         

我想在没有嵌套循环的情况下创建,最好使用Linq,一个包含ONLY唯一值的DataTable,如dt_Candidates2:

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

一个名为RejectedCandidates的列表或数组,包含不同的重复

RejectedCandidates = {"Richard, Nixon"}

如前所述,我不认为它真的需要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的内置机制使用哈希表进行更快的查找。

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"},
}
};

可以使用grouping(groupBy(查找重复项,过滤掉它们,然后使用DataTableExtensions创建新的DataTable。CopyToDataTable扩展方法:

var dt2 = dt.AsEnumerable()
.GroupBy(r => r["Candidate"])
.Where(g => g.Count() == 1)
.Select(g => g.First())
.CopyToDataTable();

相关内容

最新更新