0

以下のようなカンマ区切りの文字列のリストがあります。

    List<string> IdList=new List<string>();

リストの各要素には、次のようなカンマ区切りの文字列があります

     1,2,4,5,6,7,8,10,12,15,16
     2,3,5,7,8,9,0,10,16,17
     4,5,89,12,13,1,2,3,6,7,10,16

この文字列のリストに AND 演算を適用したいので、以下のような出力が得られます。

      2,5,7,10,16

交差操作を実装する効率的な方法はありますか?

4

3 に答える 3

2

「メモリ使用率の低下」についてはわかりませんが、これに対する私の最初のショットは、これらの行に沿ったものです(テストされておらず、ブラウザーでコード化されており、Visual Studioの便利なyadda yaddaはありません):

Dictionary<int,int> occurences = new Dictionary<int,int>();
int numberOfLists = YourCollectionOfOuterLists.Count;

foreach (string list in YourCollectionOfOuterLists) {
    foreach (string value in list.Split(',')) {
        occurences[value] = ((occurences[value] as int) ?? 0) + 1;
    }
}

List<int> output = new List<int>();
foreach (int key in occurences.Keys) {
    if (occurences[key] == numberOfLists) {
        output.Add(key);
    }
}

return String.Join(output.Select(x => x.ToString()), ",");

コードをもっと簡潔に書くことも十分に可能かもしれませんが、目的を達成するためには、ほぼ同じ手順を実行する必要があります。リストの数は不明)、それらの値から新しいリストを作成します。

アクセスできる場合はParallel.ForEach()、少なくとも 2 番目のループ (および適切なロック/同期が行われている場合は最初のループ) でウォールクロックの実行時間を短縮するのに役立つ可能性があります。

これ以外のことを求めている場合は、質問を明確にして、何が欲しいかを正確に説明してください。

于 2013-07-20T11:06:45.773 に答える