搜索自定义类列表的属性

时间:2012-05-17 14:06:39

标签: c# list if-statement iteration distinct

我有一个名为CustomClass的自定义类。它包含一个名为“Name”的变量和一个值列表(为了简单起见,我们将它变成一个int - 实际上它是另一个自定义类,但原理应该是相同的。)

所以:

public class CustomClass {
   string name;


} 

我有List<CustomClass>

当我尝试向此List添加一个值时,我想要的逻辑是为了检查它是否包含一个与我想要添加的值同名的CustomClass。

如果是,则执行x,否则执行y。

listOfCustomClass.Contains(customClassToAdd.name)在这种情况下不起作用,我想,但这是我需要的功能。

这里的最佳做法是什么?

8 个答案:

答案 0 :(得分:3)

我认为您可以尝试类似var x = MyList.Where(C =&gt; C.Name == InsertedName)并检查结果(未测试)

答案 1 :(得分:1)

你必须创建一个新类,我们称之为CustomList,它继承自IList&lt;&gt;您可以在其中覆盖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);
    }
}

答案 2 :(得分: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
        }

答案 3 :(得分:1)

在我看来,您想要覆盖List&lt; CustomClass&gt;的.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 ...
    }

答案 4 :(得分: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;
}

答案 5 :(得分:0)

您可以覆盖CustomClass中的Equals(object o)函数,这样如果两个CustomClasses的名称相同,则认为它们是相同的。然后

listOfCustomClass.Contains(customClassToAdd);

应该有用。

答案 6 :(得分:0)

另一种方法是在CustomClass上重写Equals方法,然后只调用List.Contains()

答案 7 :(得分:0)

如果name属性唯一标识CustomClass,则应重载EqualsGetHashCode()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;
}