自作クラスリストの特定の列だけでDistinctしてリストに格納する必要が出てきたのですが
なーんか力技っぽくなってしまいました(汗
「Newtonsoft.Json」要参照です。
/// <summary>
/// テストClass
/// </summary>
public class MyClass
{
public MyClass()
{
}
public MyClass(string name, string sex, string bType)
{
this.Name = name;
this.Sex = sex;
this.BloodType = bType;
}
public string Name { get; set; }
public string Sex { get; set; }
public string BloodType { get; set; }
}
こっちが取り出し本体↓
static void Main(string[] args)
{
// Distinctしたいデータたち
List<MyClass> li = new List<MyClass>();
li.Add(new MyClass("太郎", "M", "B"));
li.Add(new MyClass("花小", "F", "A"));
//同姓同名だけど血液型は違ったり同姓同名かつ血液型も一緒だったりのあんぱん男
li.Add(new MyClass("あんぱん男", "M", "A"));
li.Add(new MyClass("あんぱん男", "M", "A"));
li.Add(new MyClass("あんぱん男", "M", "A"));
li.Add(new MyClass("あんぱん男", "M", "B"));
li.Add(new MyClass("あんぱん男", "M", "O"));
li.Add(new MyClass("華麗犯男", "M", "B"));
li.Add(new MyClass("努筋女", "F", "O"));
li.Add(new MyClass("努筋女", "M", "B"));
li.Add(new MyClass("努筋女", "F", "A"));
li.Add(new MyClass("努筋女", "F", "O"));
// 名前・性別・血液型でDistinct
// ここでselectしていない項目は最終的にリストには格納されない
var query = (li.Select(e => new { e.Name, e.Sex, e.BloodType}).Distinct().ToArray());
// こっちの書き方でも返ってくる結果は同じ
//var query = (from e in li select new { e.Name, e.Sex }).Distinct().ToArray();
// ↑これをMyClassのリストにしたい!!!
List<MyClass> distinctList = new List<MyClass>();
string json = JsonConvert.SerializeObject(query); // Json文字列に変換
distinctList = JsonConvert.DeserializeObject<List<MyClass>>(json); // Json文字列をリストに変換
}
きっともっと正攻法があるんだろうけど時間がないからもうこうするしかない。。。
一人PJだからできる荒業。。
修正しました
自作クラスのコレクションに対してDistinctを使う場合
IEquatableを実装する必要があるようなので、修正してみました。
C# LINQ Distinct を自作クラスのコレクションで使う方法
jsonnet使わなくても行けますね。。
/// <summary>
/// テストClass
/// </summary>
public class MyClass : IEquatable<MyClass>
{
public MyClass()
{
}
public MyClass(string name, string sex, string bType)
{
this.Name = name;
this.Sex = sex;
this.BloodType = bType;
}
public string Name { get; set; }
public string Sex { get; set; }
public string BloodType { get; set; }
public override int GetHashCode()
{
return (this.Name +
this.Sex +
this.BloodType).GetHashCode();
}
bool IEquatable<MyClass>.Equals(MyClass mc)
{
if (mc == null)
return false;
return (this.Name == mc.Name && this.Sex == mc.Sex && this.BloodType == mc.BloodType);
}
}
static void Main(string[] args)
{
// Distinctしたいデータたち
List<MyClass> li = new List<MyClass>();
li.Add(new MyClass("太郎", "M", "B"));
li.Add(new MyClass("花小", "F", "A"));
//同姓同名だけど血液型は違ったり同姓同名かつ血液型も一緒だったりのあんぱん男
li.Add(new MyClass("あんぱん男", "M", "A"));
li.Add(new MyClass("あんぱん男", "M", "A"));
li.Add(new MyClass("あんぱん男", "M", "A"));
li.Add(new MyClass("あんぱん男", "M", "B"));
li.Add(new MyClass("あんぱん男", "M", "O"));
li.Add(new MyClass("華麗犯男", "M", "B"));
li.Add(new MyClass("努筋女", "F", "O"));
li.Add(new MyClass("努筋女", "M", "B"));
li.Add(new MyClass("努筋女", "F", "A"));
li.Add(new MyClass("努筋女", "F", "O"));
List<MyClass> ret = new List<MyClass>();
//distinctしたいぶんだけselectします。
//selectしない項目はnull
ret = li.Select(item => new MyClass { Name = item.Name }).Distinct().ToList();
}