从拆分字符串中删除数组中的重复元素

时间:2012-11-27 10:19:30

标签: c# arrays string list

我有一个关于从数组列表中删除重复项的问题。我想从两个表中加入两个字符串,然后将其拆分。将一个表中的字符串与其他表进行比较,如果存在重复项,则将其删除。 我用这个代码做了,但我问是否还有另一种更快更短的方法呢?

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);
                }
            }
        }
    }
}

5 个答案:

答案 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);