2

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

8 に答える 8

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は失敗します。Ids2

于 2012-10-30T18:59:07.690 に答える
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);
于 2012-10-30T18:03:00.787 に答える
1

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);
        }
    }
于 2012-10-30T18:08:26.713 に答える
1

個別のアイテムのリストはセットのように聞こえます

更新: 適切なデータ構造を選択する方法についての良い動機を書くのは少し面倒です。.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()の適切な定義でいくつかの素晴らしい副作用が得られる場合がありますが、その議論はおそらくこの質問の範囲外です。

于 2012-10-30T18:03:25.820 に答える
1

辞書を使用します

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

次に、すでにその生徒がいるかどうかを確認します

if (!students.ContainsKey(student.id))
{
      students.add(student.id, student);
}
于 2012-10-30T18:06:19.537 に答える
0

それを行うには多くの方法がありますが、ここでは2つの可能な解決策があります

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

Equals2. オブジェクト内のメソッドをオーバーライドし、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");
}

詳しくは:

于 2012-10-30T18:04:55.063 に答える
0

学生を保持する構造を にし、ContainsKeydictionary<int,Student>を介して ID が既に辞書にあるかどうかを確認します。

于 2012-10-30T18:05:13.723 に答える
-1

まず、使用可能なすべてのIDをlistまたはに読み込み、次にまたはarrayをチェックして、新しいIDが既存のIDと一致しないことを確認します。listarray

于 2012-10-30T18:11:05.487 に答える