如何使用C#检查对象列表中是否已存在对象

时间:2017-07-30 14:06:06

标签: c#

我希望只有classStudents尚未出现在列表中时才会_ClassStudents添加classStudents

public class ClassStudents{

   public Id {get; set;}
   public Name {get; set;}
   public List<Student> Student {get; set;}

}



public static List<ClassStudents> _ClassStudentsList = new List<ClassStudents>();

  public static void addClassStudents(ClassStudents classStudents)
  {
          //if( classStudents isn't in ClassStudentsList ) <------
           _ClassStudentsList.Add(classStudents);
   }

我该怎么做?

3 个答案:

答案 0 :(得分:6)

您可以使用Laravel 5.1 pagination count扩展名方法:

var text = nameClassStudents.Text;
if(!_ClassStudentsList.Any(t => t.Text == text))
{
    _ClassStudentsList.Add(new ClassStudents(text,(int)numericUpDown1.Value));
}

但是,这并不能保证名称在列表中是唯一的。 如果您希望保证,只需使用Any代替List<ClassStudents> 字典不允许重复键 当然,在这里你还需要在向字典添加值之前检查密钥是否存在:

var dict = new Dictionary<string, int>;
...

var text = nameClassStudents.Text;
if(!dict.ContainsKey(text))
(
    dict.Add(text, (int)numericUpDown1.Value);
)

答案 1 :(得分:3)

您还可以使用HashSet:

public class ClassStudents {

   public Id {get; set;}
   public Name {get; set;}

   public override bool Equals(object obj) {
            return this.Name.Trim().ToLower().Equals(((ClassStudents)obj).Name.Trim().ToLower());
   }

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

在main()中,您可以声明一个HashSet,如下所示:

HashSet <ClassStudents> hash = new HashSet<ClassStudents>();

现在,这将仅在集合中添加唯一元素。

答案 2 :(得分:2)

我认为正确的方法是告诉你的程序两个Turma类型相等的含义。

public class ClassStudents
{
    public string Name { get; set; }
    public int Value { get; set; }
    // Override the equality operation to check for text value only
    public override bool Equals(object obj)
    {
        if (obj is ClassStudents other) // use pattern matching
        {
            return Name.Equals(other.Name);
        }
        return false;
    }
}

现在,您可以使用列表方法.Contains()来检查项目是否存在。

{
    List<ClassStudents> classStudents = new List<ClassStudents>();

    public Test()
    {
        // Add three values
        classStudents.Add(new ClassStudents() { Name="ABC", Value=101 });
        classStudents.Add(new ClassStudents() { Name="IJK", Value=111 });
        classStudents.Add(new ClassStudents() { Name="XYZ", Value=101 });

        // Check if exists before adding this value
        ClassStudents x = new ClassStudents() { Name="ABC", Value=121 };
        // `Contains()` calls the `Equals()` method of `classStudents`
        if (!classStudents.Contains(x))
        {
            classStudents.Add(x);
        }
    }

}

这导致了最干净的代码,因为检查if(!classStudents.Contains(x))的作用很明显。此外,您还可以通过为类型添加智能来充分利用CLR的强大功能。 OOP就是在用户类中添加方法来定义操作。在这种情况下,我定义了此类型的相等意义,现在CLR可以在需要时使用此信息。