在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);
}
}
}
答案 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)
许多方法可以做到这一点,这里有两个可能的解决方案
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");
}
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读入list
或array
,然后通过选中list
或array
确保新ID与现有ID不匹配。