C#Collection / List - 唯一ID

时间:2012-10-30 17:59:26

标签: c# list

在C#中我试图创建一个对象列表,当一个新的东西被添加到列表中时,会检查它是否确保使用了相同的ID。我在Linq有解决方案,但我试图在没有linq的情况下做到这一点。

public void AddStudent(Student student)
        {
            if (students == null)                               
            {
                students.Add(student);                          
            }
            else
            {
                if ((students.Count(s => s.Id == student.Id)) == 1)   

                  // LINQ query, student id is unique
            {
                throw new ArgumentException("Error student " 
                  + student.Name + " is already in the class");
            }
            else
            {
                students.Add(student);
            }
        }
    }

8 个答案:

答案 0 :(得分:5)

另一种方法是使用HashSet代替List

Student类:

public class Student
{
    private int id;

    public override int GetHashCode()
    {
        return this.id;
    }
    public override bool Equals(object obj)
    {
        Student otherStudent = obj as Student;
        if (otherStudent !=null)
        {
            return this.id.Equals(otherStudent.id);
        }
        else
        {
            throw new ArgumentException();
        }

    }

    public int Id
    {
        get { return id; }
        set { id = value; }
    }

}

然后你可以添加这样的东西

    HashSet<Student> hashSetOfStudents = new HashSet<Student>();
    Student s1 = new Student() { Id = 1 };
    Student s2 = new Student() { Id = 2 };
    Student s3 = new Student() { Id = 2 };

    hashSetOfStudents.Add(s1);
    hashSetOfStudents.Add(s2);
    hashSetOfStudents.Add(s3);

s3的添加将失败,因为它与Id具有相同的s2

答案 1 :(得分:2)

您可以覆盖Student.Equals()Student.GetHashCode()以检查Student.Id是否相等。如果学生列表继承自List<Student>,则可以使用默认的Add()方法。它只会为学生添加不同的ID。

public class Student
{
    // ...

    public override bool Equals(object obj)
    {
        // Check for null values and compare run-time types.
        if (obj == null || GetType() != obj.GetType()) 
            return false;

        Student other = obj as Student;
        return this.Id == other.Id;
    }

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

public class StudentList : List<Student> { }

// Usage:

var students = new StudentList();
students.Add(student);

答案 2 :(得分:1)

不同项目的列表听起来非常像set

更新:为如何选择合适的数据结构写出一个很好的动机有点单调乏味,我只会告诉你如何在熟悉.NET框架后编写上述内容:

public void AddStudent(Student student)
{
    /* this.students is an ISet<Student> */
    if (!this.students.Add(student))
    {
       throw new ArgumentException("student");
    }
}

这当然假设 Student 具有 Equals() GetHashCode()的合适定义。根据所使用的具体ISet类型,您实际上可以通过 GetHashCode()的良好定义获得一些不错的副作用,但该讨论可能有点超出了此问题的范围。

答案 3 :(得分:1)

我会使用Dictionary

students Dictionary<int, Student> = new Dictionary<int, Student>();

然后检查你是否已经有那个学生

if (!students.ContainsKey(student.id))
{
      students.add(student.id, student);
}

答案 4 :(得分:0)

许多方法可以做到这一点,这里有两个可能的解决方案

1。您可以遍历列表。

bool alreadyInList = false;
foreach (var item in students) 
{
 if (item.Id == student.Id)
 {
    alreadyInList = true;
    break; // break the loop
 }
}

if (!alreadyInList)
{
   students.Add(student);
} 
else
{
     throw new ArgumentException("Error student " 
              + student.Name + " is already in the class");
}

2。覆盖Equals对象中的Student方法,然后使用Contains进行检查。

public class Student 
{
    public override bool Equals(object x) 
    {
        return ((Student)x).Id == this.Id;
    }
}

if (!students.Contains(student)) 
{
   students.Add(student);
} 
else 
{
     throw new ArgumentException("Error student " 
              + student.Name + " is already in the class");
}

更多信息:

答案 5 :(得分:0)

使结构能够让学生成为dictionary<int,Student>并通过ContainsKey检查该ID是否已经在字典中。

答案 6 :(得分:0)

使用foreach循环:

    public void AddStudent(Student student)
    {
        if (students == null)
        {
            students.Add(student);
        }
        else
        {
            foreach (var s in students)
            {
                if (student.Id == s.Id)
                {
                    throw new ArgumentException("Error student "
                    + student.Name + " is already in the class");
                }
            }
            students.Add(student);
        }
    }

答案 7 :(得分:-1)

首先将所有可用的ID读入listarray,然后通过选中listarray确保新ID与现有ID不匹配。