0

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

所以 :

public class CustomClass {
   string name;


} 

我有一个List<CustomClass>.

当我尝试向这个 List 添加一个值时,我想要的逻辑是让这个 List 检查它是否包含一个与我要添加的值同名的 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

您必须创建一个新类,我们称之为 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 执行此操作,但您必须公开 name 字段。

        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 回答
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 回答
0

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

listOfCustomClass.Contains(customClassToAdd);

应该管用。

于 2012-05-17T14:14:08.077 回答
0

另一种方法是在您的 CustomClass 上覆盖 Equals 方法,然后调用 List.Contains()

于 2012-05-17T14:15:59.757 回答
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;
}
于 2012-05-17T14:16:10.227 回答