我有一个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();