0

CustomClass というカスタム クラスがあります。「Name」と呼ばれる変数と値のリストが含まれています (簡単にするために、これを int にしましょう。実際には別のカスタム クラスですが、原則は同じである必要があります)。

そう :

public class CustomClass {
   string name;


} 

私は持っていList<CustomClass>ます。

このリストに値を追加しようとすると、必要なロジックは、追加する値と同じ名前の CustomClass がこのリストに含まれているかどうかを確認することです。

ある場合は x を実行し、そうでない場合は y を実行します。

この場合、 listOfCustomClass.Contains(customClassToAdd.name) は機能しないと思いますが、これは私が必要とする機能です。

ここでのベストプラクティスは何ですか?

4

8 に答える 8

3

var x = MyList.Where(C => C.Name == InsertedName)のようなものを試して、結果を確認できると思います(テストされていません)

于 2012-05-17T14:12:15.483 に答える
1

これを試して:

IList<CustomClass> list = new List<CustomClass>();

CustomClass customClass = new CustomClass();
customClass.name = "Lucas";

if((list.Tolist().Find(x => x.name == customClass.name)) == null)
{
    list.Add(customClass);
}
else
{
    //do y;
}
于 2012-05-17T14:48:28.323 に答える
1

新しいクラスを作成する必要があります。CustomList と呼びましょう。これは IList<> から継承し、add メソッドをオーバーライドしてチェックを行い、ベースに追加できます。このようなもの:

public class CustomList<T> : IList<T> where T : CustomClass
{
    private List<T> innerlist;
    public void Add(T item)
    {
        if(innerlist.Any(a => a.Name == item.Name)))
            innerlist.Add(item);
    }
}
于 2012-05-17T14:15:32.407 に答える
1

次のようにlinqを使用して実行できますが、名前フィールドを公開する必要があります。

        List<CustomClass> list = new List<CustomClass>();
        CustomClass toCheck = new CustomClass();

        if (list.Any(p => p.name.Equals(toCheck)))
        {
            //do x here
        }
        else
        {
            //do y here
        }

ただし、linq を使用したくない場合は、次のように CustomClass でいくつかの変更を行います。

public class CustomClass
{
    string name;
    List<int> intLost = new List<int>();

    public override bool Equals(object obj)
    {
        return this.Equals(obj as CustomClass);
    }

    public override int GetHashCode()
    {
        return 0;
    }

    public bool Equals(CustomClass cc)
    {
        if (cc == null) return false;
        return this.name.Equals(cc.name);
    }
}

次に、これを行うことができます。

        List<CustomClass> list = new List<CustomClass>();

        CustomClass toCheck = new CustomClass();
        if (list.Contains(toCheck))
        {
            //do x here
        }
        else
        {
            //do y here
        }
于 2012-05-17T14:16:39.043 に答える
1

List<CustomClass> の .Add() 動作をオーバーライドしたいようです。拡張メソッドを使用することもできますが、より良い解決策は、何らかの方法で List を拡張するクラスを発明することだと思います。追加操作をそのレベルで制御する必要がある場合は、コレクション クラスに IList を実装することをお勧めします...

    public class CustomClassList : IList<CustomClass>
    {
        public void Add (CustomClass item)
        {
            if(this.Select(t => t.Name).Contains(item.Name))
                // Do whatever here...
            else
                // Do whatever else here...
        }

        // ... other IList implementations here ...
    }
于 2012-05-17T14:20:31.357 に答える
0

CustomClassのEquals(object o)関数をオーバーライドして、名前が同じである場合に2つのCustomClassが等しいと見なされるようにすることができます。それで

listOfCustomClass.Contains(customClassToAdd);

動作するはずです。

于 2012-05-17T14:14:08.077 に答える
0

もう 1 つの方法は、CustomClass で Equals メソッドをオーバーライドしてから、List.Contains() を呼び出すことです。

于 2012-05-17T14:15:59.757 に答える
0

nameプロパティが CustomClass を一意に識別する場合は、Equalsand をオーバーロードする必要がありGetHashCode()ます。機能しない理由List.Containsは、HashCodes の下で比較されるためです。したがって、オーバーロードする必要がありGetHashCodeEquals次のようなものが必要です。

public override int GetHashCode()
{
    return this.name.GetHashCode();
}

public override bool Equals(object obj)
{
    var other = obj as CustomClass;

    if (other != null)
    {
        if (other.Name == this.Name)
        {
             return true;
        }
    }
    return false;
}
于 2012-05-17T14:16:10.227 に答える