1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Json.netを使って自作クラスをDistinctしてListに格納する

Last updated at Posted at 2015-12-22

自作クラスリストの特定の列だけで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();
}
1
1
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?