1

ObservableCollection<Employe>私はいくつかのコレクションを埋めました:

// Program.Data.Employees - it is ObservableCollection<Employe>.
Program.Data.Employees.Add(new Employe() { Name="Roman", Patronymic="Petrovich", Surname="Ivanov" });
Program.Data.Employees.Add(new Employe() { Name = "Oleg", Patronymic = "Vladimirovich", Surname = "Trofimov" });
Program.Data.Employees.Add(new Employe() { Name = "Anton", Patronymic = "Igorevich", Surname = "Kuznetcov" });

コードの他の場所で、このコレクションからいくつかのアイテムを削除しようとしています。

// Program.Data.Employees - it is ObservableCollection<Employe>.
Employe x = Program.Data.Employees.First(n => n.Guid == emp.Guid); // x is not null.
Int32 index = Program.Data.Employees.IndexOf(x); // I got -1. Why?
Boolean result = Program.Data.Employees.Remove(x); // I got 'false', and item is not removed. Why?
// But this works fine:
Program.Data.Employees.Clear();

コレクションをクリアすることはできますが、必要なアイテムを削除することはできません。なぜそれが起こるのですか?

UPD:私のクラスEqualsのメソッドEmploye

public bool Equals(Employe other) {
    return
    other.Guid == this.Guid &&
    String.Equals(other.Name, this.Name, StringComparison.CurrentCultureIgnoreCase) &&
    String.Equals(other.Patronymic == this.Patronymic, StringComparison.CurrentCultureIgnoreCase) &&
    String.Equals(other.Surname == this.Surname, StringComparison.CurrentCultureIgnoreCase) &&
    other.Sex == this.Sex &&
    String.Equals(other.Post == this.Post, StringComparison.CurrentCultureIgnoreCase);
}
4

1 に答える 1

3

エラーを再現するために、次のコードを試しました。

class Employee
{
  public string Name { get; set; }
  public Guid Guid { get; set; }
}

// ...
ObservableCollection<Employee> employees = new ObservableCollection<Employee>();
var guid1 = Guid.NewGuid();
employees.Add(new Employee { Name = "Roman", Guid = guid1 });
employees.Add(new Employee { Name = "Oleg", Guid = Guid.NewGuid() });

var x = employees.First(e => e.Guid == guid1);
var index = employees.IndexOf(x); // index = 0, as expected
var result = employees.Remove(x); // result = true, as expected

期待通りに動作しました。私は提案します、あなたはブレークポントを設定しvar x = ...てチェックしますか?

  • コレクションには本当にあなたが探しているアイテムが含まれています
  • First()本当にそのアイテムを返す場合

次に、次の行に移動して、indexが正しく返されるかどうかを確認します。そして最後に、result本当に間違っているかどうかをもう一度確認します。

コードが失敗する原因として考えられるものがいくつかあります。

  • あなたは完全なコードを投稿していませんでした、そして何かがとの間x=Program.Data.Employees.First()で起こりますProgram.Data.Employees.IndexOf()
  • マルチスレッドコードを使用します(これにより、2つのステートメント間で「何かが発生」します)。この場合、コレクションへのアクセスを同期する必要があります
  • 直接使用するのObservableCollectionではなく、データレイヤーによって構築される派生クラスを使用します(たとえばDataServiceCollection、これも正常に機能するはずです)。この場合、デバッガーでコレクションの実際のタイプを確認してください

コレクションのエラーのもう1つの一般的な原因は、コレクションの反復中に(つまり、foreachループ内で)アイテムを削除しようとした場合です。ただし、この場合、例外がスローされる(IndexOf正常に機能する)ため、これは次の場合にのみ適用されます。非標準の動作を実装する派生クラスを使用します。

編集 (メソッドを投稿する見返りにEqual

メソッドEqualに重大なエラーがあります。

String.Equals(other.Patronymic == this.Patronymic, StringComparison.CurrentCultureIgnoreCase)
... // applies also for following comparisons

する必要があります

String.Equals(other.Patronymic, this.Patronymic, StringComparison.CurrentCultureIgnoreCase)
...

また、GUIDを使用している場合は、GUIDの比較のみを検討してください。これは通常、「一意の識別子」を意味するため、一部のエンティティを識別するのに十分なはずです。

于 2012-11-17T11:48:46.350 に答える