0

配列リストから重複を削除することについて質問があります。2つのテーブルから2つの文字列を結合して、それを分割したいと思います。あるテーブルの文字列を他のテーブルと比較します。重複が存在する場合は、削除します。私はこのコードでそれを行いましたが、それを行うための別のより速くてより短い方法があるかどうか尋ねていますか?

表1: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);
                }
            }
        }
    }
}
4

5 に答える 5

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();
于 2012-11-27T10:25:00.090 に答える
0

次を使用できます。Enumerable.Unionは、デフォルトの等式比較器を使用して2つのシーケンスの集合和を生成します。

        string[] id1 = { "abc" };
        string[] id2 = { "def", "abc", "okl" };

        IEnumerable<string> both = id2.Union(id1);

        foreach (string id in both)
            Console.WriteLine(id);
于 2012-11-27T10:51:55.620 に答える
0

Enumerable.Union()メソッドは重複を削除します:

var items1 = new[] { "abc" };
var items2 =  "def,abc,okl";

var splitItems2 = items2.Split(',');

var result = 
    items1.Union(splitItems2) // Removes duplicates
    .ToArray();
于 2012-11-27T10:45:18.663 に答える
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();                        
        .........
    }
}

これにより、内部テーブルの不要なループが削除されます

于 2012-11-27T10:31:23.873 に答える
0

最初にすべての要素を含むリストを作成し、リストを並べ替えて重複を削除できます。ここに関連する質問があります:配列から重複を削除します

于 2012-11-27T10:34:25.623 に答える