###前提・実現したいこと
ローカルに保持したデータとWebから引っ張ってきたデータの値(ここではName
)を比較したいと考えています。Idが各Listで異なるため(ここは現時点では仕様なので仕方ないものとして考えてください。)、ListのName
のみを比較して、差集合を得たいです。
以下のコードの例では、local
のPerson(1,"test1")
とweb
のPerson(2,"test1")
を同じ要素として扱いたい。という意図です。
Name
のみをstring[]
に抜き出して差集合を出して再度別のListを作るという非常に汚らしいコードはできたのですが、よりエレガントな方法があれば知りたいです。
よろしくお願いいたします。
欲しい結果
List<Person>
の以下の要素です。
4,"test4"
5,"test5"
###該当のソースコード
csparp
1class Class1 2{ 3 static void Main(string[] args) 4 { 5 var local = new List<Person> 6 { 7 new Person(1,"test1"), 8 new Person(2,"test2"), 9 new Person(3,"test3"), 10 new Person(4,"test4"), 11 new Person(5,"test5"), 12 }; 13 14 var web = new List<Person> 15 { 16 new Person(2,"test1"), 17 new Person(3,"test2"), 18 new Person(4,"test3"), 19 }; 20 21 // エレガントな方法はないのでしょうか? 22 string[] arrLocal = local.Select(x => x.Name).ToArray(); 23 string[] arrWeb = web.Select(x => x.Name).ToArray(); 24 var diff = arrLocal.Except(arrWeb).ToArray(); 25 26 var diffList = new List<Person>(); 27 foreach (var item in diff) 28 { 29 diffList.Add(local.FirstOrDefault(x => x.Name == item)); 30 } 31 } 32} 33public class Person 34{ 35 public int Id { get; private set; } 36 public string Name { get; private set; } 37 38 public Person(int id, string name) 39 { 40 this.Id = id; 41 this.Name = name; 42 } 43}
###試したこと
foreachを入れ子にしたり、Hashsetを使ったりを考えたのですが、条件設定がうまくいかず、欲しい結果が得られませんでした。
###補足情報(言語/FW/ツール等のバージョンなど)
C# 6.0 です。
回答7件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。