Неліктен жиынтықтар үшін жеке әдіс бар?

C Sharp. NET ішінде Equals әдісі және SetEquals әдісі бар. Қай жерде айырмашылық бар?

Java-мен шыққан кезде, менің ойымша, SetEquals қажет емес, тек барлық нысандар үшін Equals әдісін қолданыңыз.

22
қосылды автор Jodrell, көзі
Менің ойымша, құжаттама айырмашылығы неде екендігі анық.
қосылды автор Nikita B, көзі

7 жауаптар

SetEquals doesn't obey the same contract as Equals. In particular it's not symmetric, as the argument is just IEnumerable rather than ISet. This allows you to check for set equality while only having one set. Consider:

List intList = new List { 1, 2, 3 };
HashSet intSet = new HashSet(intList);

Енді біз пайдалана аламыз:

Console.WriteLine(intSet.SetEquals(intList));

... but we couldn't implement Equals in the same way without enforcing the same behaviour on List and every other IEnumerable implementation.

Even if we restricted it to other sets, there's the interesting question of what equality really means. For example, consider two HashSet sets which contain the same strings, but have different equality comparers. (Maybe one is case-sensitive and one isn't.) Are those equal, or not? SetEquals manages to avoid such philosophical questions by avoiding trying to be too general.

What about a HashSet and a SortedSet? Could they ever be equal? They can have the same values - but the ordering of one is undefined.

Жалпы, Object.Equals және Object.GetHashCode идеялары менің көзқарасымда өте кең. Жиі сіз теңдік түрін келеді, және көбінесе объектілерді теңестіру үшін бірінші кезекте салыстыруға болмайды. Бұл мүлдем басқа рента тақырыбын оңай құрастыруы мүмкін, бірақ осы уақытқа дейін мен де, ең болмағанда, бұл .NET бұл кең ауқымды идеяны коллекцияға қолдануға тырыспағанына қуаныштымын. SetEquals функциясын нақты анықталған мағынаны пайдалану мүмкіндігі әлдеқайда пайдалы, IMO.

32
қосылды

HashSet.SetEquals determines if the HashSet contains the same elements as a given IEnumerable. But why should it return true if the types are diffferent?

HashSet h = new HashSet();
h.Add(0);
h.Add(1);
int[] ints = new[] { 0, 1, 1, 0 };
h.SetEquals(ints);//true, ignores duplicates because it's a set
h.Equals(ints);//false, correct because not even the same types

MSDN:

SetEquals әдісі қайталанатын жазбаларды және тәртібін елемейді   басқа параметрдегі элементтер .....

Since HasetSet does not override Equals it uses the one inherited from object which just compares references. So if two objects are not the same reference it returns false.

11
қосылды
  • Equals would test if two HashSets are the same object.
  • SetEquals takes in a IEnumerable, What it does is: "The SetEquals method ignores duplicate entries and the order of elements in the other parameter."

Сонымен, SetEquals - IEnumerable-ты HashSet-ге жүктегеніңізді тексеру үшін, ол сіздің көзіңіздегідей HashSet-ті жасай ма?

5
қосылды

Equals checks for reference equality between the two and SetEquals will check the elements on the collection.

3
қосылды

SetТең:

Checks if the HashSet contains the same elements as a given IEnumerable.

SetEquals method treats the second collection as though it has no duplicate elements. If duplicate elements are present, the two collections may still be considered equal.

Тең:

Шын мәнінде - референттік тест

List stringList = new List { "a", "b", "c" };
SortedSet stringSet = new SortedSet { "a", "b", "c" };

bool a = stringSet.SetEquals(stringList );
// See if the two collections contain the same elements.
0
қосылды

The ISet.SetEquals implementation

Ағымдағы жиындар мен көрсетілген жиынның бірдей элементтері бар-жоғын анықтайды.

The the Equals implementation inherited from object

ReferenceEquals әдісіне шақыру үшін балама.

Мұраға берілген ReferenceEquals іске асуы,

Көрсетілген нысан даналары бірдей данасы болатынын анықтайды.


In paticular, note that the IEnumerable sequence passed to SetEquals could have one or more instances of every member of the set, in any order, and SetEquals would still return true.


Егер екі рет бірдей тәртіпте бірдей мүшелерді қамтитынын растау керек болса, SequenceEqual кеңейтімі.

0
қосылды
public static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");

            System.Collections.Generic.HashSet setA= new System.Collections.Generic.HashSet();
            setA.Add(1);
            System.Collections.Generic.HashSet setB= new System.Collections.Generic.HashSet();
            setB.Add(1);


            Console.WriteLine("Equals method returns {0}", setA.Equals(setB));
            Console.WriteLine("SetEquals method returns {0}", setA.SetEquals(setB));


            Console.Write("Press any key to continue . . . ");
            Console.ReadKey(true);
        }

Шығарылатын өнім: Әдіс тең қайтарылады False SetEquals әдісі True мәнін қайтарады

Осылайша әдіс теңдікке ұқсас болып табылады.

0
қосылды