0

私は次のクラスを持っています:

public class MapsDescModel : NotificationObject, IEqualityComparer<MapsDescModel>
{
    public MapsDescModel(ObservableCollection<MainCategories> mainCategoty)
    {
        MainCategories = mainCategoty;
    }

    private MainCategories _mainCategorySelectedItem;
    public MainCategories MainCategorySelectedItem
    {
        get { return _mainCategorySelectedItem; }
        set
        {
            if (Equals(value, _mainCategorySelectedItem)) return;
            _mainCategorySelectedItem = value;
            RaisePropertyChanged("MainCategorySelectedItem");
            RaisePropertyChanged("SubCategories");
        }
    }

    private SubCategories _subCategorySelectedItem;
    public SubCategories SubCategorySelectedItem
    {
        get { return _subCategorySelectedItem; }
        set
        {
            if (Equals(value, _subCategorySelectedItem)) return;
            _subCategorySelectedItem = value;
            RaisePropertyChanged("SubCategorySelectedItem");
        }
    }

    private ObservableCollection<MainCategories> _mainCategories;
    public ObservableCollection<MainCategories> MainCategories
    {
        get { return _mainCategories; }
        set
        {
            if (Equals(value, _mainCategories)) return;
            _mainCategories = value;
            RaisePropertyChanged("MainCategories");
        }
    }

    public ObservableCollection<SubCategories> SubCategories
    {
        get
        {
            if (MainCategorySelectedItem != null)
                return
                    Infrastructure.Helpers.ExtensionMethods.ToObservableCollection(
                        MainCategorySelectedItem.SubCategory.AsEnumerable());
            else return new ObservableCollection<SubCategories>();
        }
    }


    public bool Equals(MapsDescModel x, MapsDescModel y)
    {
        return
            x.MainCategorySelectedItem.MainCatID == y.MainCategorySelectedItem.MainCatID &&
            x.SubCategorySelectedItem.SubCatID == y.SubCategorySelectedItem.SubCatID;
    }

    public int GetHashCode(MapsDescModel obj)
    {
        if (Object.ReferenceEquals(obj, null)) return 0;

        if (obj.MainCategorySelectedItem == null || obj.SubCategorySelectedItem == null) 
            return 0;
        else  return obj.MainCategorySelectedItem.Category.GetHashCode() + obj.SubCategorySelectedItem.Category.GetHashCode();
    }
}

そして、私は他のクラスに次のコレクションを持っています:

MapsGrid = new ObservableCollection<MapsDescModel>()

メソッドを使用しようとしていますMapGrid.Distinct()が、正常に機能しません。

プロパティMainCatIDSubCatIDIntegerです。同じプロパティ値を持つ 2 つのオブジェクトをコレクションに挿入し、Distinctメソッドを使用しても何も起こりません。コード ( Console.WriteLine(MapsGrid[0].Equals(MapsGrid[1]));) で比較の結果を確認すると、プロパティが等しい場合でも false が返されます。私の間違いはどこですか?


アップデート:

MapsDescModel クラスを編集しました:

  public class MapsDescModel : NotificationObject, IEqualityComparer<MapsDescModel>, IEquatable<MapsDescModel>
    {
        public MapsDescModel(ObservableCollection<MainCategories> mainCategoty)
        {
            MainCategories = mainCategoty;

        }



        private MainCategories _mainCategorySelectedItem;
        public MainCategories MainCategorySelectedItem
        {
            get { return _mainCategorySelectedItem; }
            set
            {
                if (Equals(value, _mainCategorySelectedItem)) return;
                _mainCategorySelectedItem = value;
                RaisePropertyChanged("MainCategorySelectedItem");
                RaisePropertyChanged("SubCategories");
            }
        }

        private SubCategories _subCategorySelectedItem;
        public SubCategories SubCategorySelectedItem
        {
            get { return _subCategorySelectedItem; }
            set
            {
                if (Equals(value, _subCategorySelectedItem)) return;
                _subCategorySelectedItem = value;
                RaisePropertyChanged("SubCategorySelectedItem");
            }
        }


        private ObservableCollection<MainCategories> _mainCategories;
        public ObservableCollection<MainCategories> MainCategories
        {
            get { return _mainCategories; }
            set
            {
                if (Equals(value, _mainCategories)) return;
                _mainCategories = value;
                RaisePropertyChanged("MainCategories");
            }
        }

        public ObservableCollection<SubCategories> SubCategories
        {
            get
            {
                if (MainCategorySelectedItem != null)
                    return
                        Infrastructure.Helpers.ExtensionMethods.ToObservableCollection(
                            MainCategorySelectedItem.SubCategory.AsEnumerable());
                else return new ObservableCollection<SubCategories>();
            }
        }


        public bool Equals(MapsDescModel x, MapsDescModel y)
        {
            if (x.MainCategorySelectedItem == null || x.SubCategorySelectedItem == null ||
                y.MainCategorySelectedItem == null || y.SubCategorySelectedItem == null)
                return false;

            return
                x.MainCategorySelectedItem.MainCatID == y.MainCategorySelectedItem.MainCatID &&
                x.SubCategorySelectedItem.SubCatID == y.SubCategorySelectedItem.SubCatID;
        }

        public int GetHashCode(MapsDescModel obj)
        {
            if (Object.ReferenceEquals(obj, null)) return 0;

            if (obj.MainCategorySelectedItem == null || obj.SubCategorySelectedItem == null)
                return 0;
            else return obj.MainCategorySelectedItem.Category.GetHashCode() + obj.SubCategorySelectedItem.Category.GetHashCode();
        }

        public bool Equals(MapsDescModel other)
        {
            return
            this.Equals(this, other);  // use definition from IEqualityComparer<T>
        }

        public override bool Equals(object obj)
        {
            MapsDescModel other = obj as MapsDescModel;
            if (other == null)
                return base.Equals(obj);
            else
                return this.Equals(other);
        }

        public override int GetHashCode()
        {
            MapsDescModel other = this as MapsDescModel;
            if (other == null)
                return base.GetHashCode();
            else
                return this.GetHashCode(other);
        }

Distinct メソッドを実行すると、まだ機能しません。「Console.WriteLine(MapsGrid[0].Equals(MapsGrid[1]));」という行があるため、Equality メソッドが機能していることはわかっています。true を返します。

何か案は?

4

2 に答える 2

1

ヘルプが必要な場合は、尋ねられた質問に答えてください。

override bool Equals(object obj) が呼び出され、何が返されますか?
あなたの回答は、その非常に重要な質問に答えることができませんでした。

オブジェクトを実装していないので、これらの OverRides が呼び出されていないと思われます

Equals メソッドの実装

IEqualityComparer をクラス (MapsDescModel) に適用しており、コレクションに適用されます

IEqualityComparer インターフェイス

あなたがする必要がある(またはすることを意味する)ことは、クラス MainCategories で GetHashCode と Equals を OverRide することだと思いますが 、
MainCategories の定義を投稿していません。

public ObservableCollection<MainCategories> MainCategories 

コレクションのコレクション?
明確にするために、プロパティにクラスの名前を付けないことを検討してください

于 2013-04-09T16:18:53.783 に答える
1

を実装IEqualityComparer<T>しました。これは、クラスのインスタンスを に渡したい場合に適していますDistinct

var distinctList = MapGrid.Distinct(new MapsDescModel());

IEquatable<T>ただし、代わりに実装するのがよりクリーンなメソッドDistinctですIEqualityComparer<T>

public class MapsDescModel : NotificationObject, IEqualityComparer<MapsDescModel>, IEquatable<MapsDescModel>
{
...
    public bool Equals(MapsDescModel y)
    {
        return
            this.Equals(this,y);  // use definition from IEqualityComparer<T>
    }  
}

また、オーバーライドobject.Equalsobject.GetHashCodeて一貫性を保つために、必要に応じてメソッドを再度活用することをお勧めします (または、メソッドが不要になった場合はメソッドをオーバーライドIEqualityComparerに変換するだけです)。IEqualityComparer

于 2013-04-09T16:16:12.937 に答える