我有一个数据表
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"}
如上所述,我认为这里并不真正需要 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"},
}
};
您可以使用分组(groupBy)来查找重复项,过滤掉它们,然后使用 DataTableExtensions.CopyToDataTable 扩展方法创建一个新的 DataTable:
var dt2 = dt.AsEnumerable()
.GroupBy(r => r["Candidate"])
.Where(g => g.Count() == 1)
.Select(g => g.First())
.CopyToDataTable();