我有一个关于从数组列表中删除重复项的问题。我想从两个表中加入两个字符串,然后将其拆分。将一个表中的字符串与其他表进行比较,如果存在重复项,则将其删除。 我用这个代码做了,但我问是否还有另一种更快更短的方法呢?
table1:String a = "abc"
表2:String b = "def,abc,okl"
结果:"abc,def,okl"
我的代码:
foreach(DataRow tr in transM.Rows)
{
foreach(DataRow tb in tableDGV1.Rows)
{
if (tr["ID"].ToString() == tb["ID"].ToString())
{
string trMitter = tr["Tr"].ToString() + "," + tb["Tr"].ToString();
string[] trSplit = trMitter.Split(new char[] {','}, StringSplitOptions.RemoveEmptyEntries);
List<string> listTr = new List<string>(trSplit);
for (int k = 0; k < listTr.Count; k++)
{
for (int g = k + 1; g < listTr.Count; g++)
{
if (listTr[g].ToString() == listTr[k].ToString()) listTr.RemoveAt(g);
}
}
}
}
}
答案 0 :(得分:2)
我使用的是.Net V 3.5或更高版本,您只需使用
即可var firstSource = firstString.Split(',');
var secondeSource = secondString.Split(',');
var result = firstSource.Union(secondSource);`
或使用.Distinct()
:
foreach(DataRow tr in transM.Rows)
{
foreach(DataRow tb in tableDGV1.Rows)
{
if (tr["ID"].ToString() == tb["ID"].ToString())
{
string trMitter = tr["Tr"].ToString() + "," + tb["Tr"].ToString();
string[] trSplit = trMitter.Split(new char[] {','}, StringSplitOptions.RemoveEmptyEntries);
IEnumerable<string> noDuplicate = trSplit.Distinct();
}
}
}
或者更多的Linqish风格:
var noDuplicate = from DataRow row1 in transM.Rows
from DataRow row2 in tableDGV1.Rows
where row1["ID"].Equals(row2["ID"])
let array1 = row1["tr"].ToString().Split(',', StringSplitOptions.RemoveEmptyEntries)
let array2 = row2["tr"].ToString().Split(',', StringSplitOptions.RemoveEmptyEntries)
select array1.Union(array2).Distinct();
答案 1 :(得分:0)
我怀疑表格行上的循环会产生很大影响 您可以使用此优化查询(如果ID列是主键)
foreach(DataRow tr in transM.Rows)
{
string idValue = tr["ID"].ToString();
DataRow[] foundRows = tableDGV1.Select("ID = " + idValue);
if(foundRows.Length == 1)
{
// Here you have the internal row to join with the external one
string joinedString = tr["Tr"].ToString() + "," + foundRows[0]["Tr"].ToString();
string[] trSplit = joinedString.Split(new char[] {','},
StringSplitOptions.RemoveEmptyEntries);
List<string> listTr = trSplit.Distinct().ToList();
.........
}
}
这将删除内部表中不必要的循环
答案 2 :(得分:0)
您可以首先创建包含所有元素的列表,对列表进行排序并删除重复项。 这里有一个相关的问题:Remove duplicates from array
答案 3 :(得分:0)
Enumerable.Union()
方法删除了重复项:
var items1 = new[] { "abc" };
var items2 = "def,abc,okl";
var splitItems2 = items2.Split(',');
var result =
items1.Union(splitItems2) // Removes duplicates
.ToArray();
答案 4 :(得分:0)
您可以使用:Enumerable.Union通过使用默认的相等比较器生成两个序列的集合。
string[] id1 = { "abc" };
string[] id2 = { "def", "abc", "okl" };
IEnumerable<string> both = id2.Union(id1);
foreach (string id in both)
Console.WriteLine(id);