繁体   English   中英

搜索自定义类列表的属性

[英]Searching the properties of a list of a custom class

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

因此:

public class CustomClass {
   string name;


} 

我有一个List<CustomClass>

当我尝试向此列表添加值时,我想要的逻辑是让此列表检查它是否包含与我要添加的值同名的CustomClass。

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

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

什么是最佳做法?

我认为您可以尝试类似var x = MyList.Where(C => C.Name == InsertedName)的方法并检查结果(未经测试)

您必须创建一个新类,将其称为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);
    }
}

您可以按照以下步骤使用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
        }

在我看来,您想覆盖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 ...
    }

尝试这个:

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;
}

您可以在CustomClass中重写Equals(object o)函数,以便如果两个CustomClass的名称相同,则认为它们相等。 然后

listOfCustomClass.Contains(customClassToAdd);

应该管用。

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

如果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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM