実現したいこと
お世話になります。C#にて、高速に配列処理を実施したく、下記のようなことを実現できないか検討しております。
子リスト「List<string>」 を格納する親Listへ、子Listを重複なくAddしたい。
具体的には、下記コードとなります。
該当のソースコード
List<List<string>> parentList = new List<List<string>>(); List<string> list1 = new List<string>() { "a", "b" }; List<string> list2 = new List<string>() { "a", "c" }; List<string> list3 = new List<string>() { "a", "b" }; parentList.Add(list1); parentList.Add(list2); parentList.Add(list3); // 内容が重複しているので、Addされないようにしたい
試したこと
list1 と list3は内容が同じなので、
list1.SequenceEqual(list3);
と実行すると、trueが戻り、内容の判定ができることはわかりました。
しかし、Addする際に毎回すべての子List要素をForループでSequenceEqualにて判定すると処理速度が低下してしまうため、他に良い方法がないか検討しております。
もし、良い方法がございましたらご教示いただければ幸いです。
List<string> を使う限り高速化は難しい気がします。これの使用法と、子要素の条件によってはできるかもしれません。
とりあえずすべての要素をListに入れてから、重複を削除するのはどうでしょう?
Zuishin様、k.matsuda 様
ご回答ありがとうございます。初めての投稿にこんなに早くレスポンス頂き感動しております。
>List<string> を使う限り高速化は難しい…
List<string>であるとその後のデータ取り扱いが便利になりますのでこのような形式を検討しておりましたが、最悪は改行コードなどを区切り文字とした連結文字列にする、という案を採用しようかと考えています。
>とりあえずすべての要素をListに入れてから、重複を削除…
この方法にて、「Distinct」というメソッドを試してみましたが、うまく重複削除されず断念しました。Distinctの使い方が間違っているかもしれませんので、もう少し検討してみます。
これの使用法と、子要素の条件によってはできるかもしれません。
たとえば要素の数が二つと決まっているなら List<string> の代わりにタプルが使えるので次のようにできます。
var source= new List<(string, string)>()
{
("a", "b"),
("a", "c"),
("a", "b")
};
var dest = source.ToHashSet().ToList();
あるいは
var dest = source.Distinct().ToList();
これは「たとえば」の話で、要素の数によらず Distinct を使うこともできますが、List<string> のままでは使えません。
Zuishin様
ご回答ありがとうございました。今回の要件では要素数は可変でしたので、Distinct方式で検討を進めてみたいと思います。
回答2件
あなたの回答
tips
プレビュー