Pouze tento týden sleva až 80 % na e-learning týkající se Swift
Využij akce až 80 % zdarma při nákupu e-learningu. Více informací.
discount week 80
Avatar
Tomáš M.
Člen
Avatar
Tomáš M.:6. září 18:06

Ahoj,
mám nejasnost u funkce Except v rámci LINQ. Tato funkce při použití komparátoru, který porovnává pouze vlastnost 'A' porovnávané třídy, vyloučí dle mého více instancí z listu, než by měla.

public class MyClass
{
    public string A { get; set; }
    public string B { get; set; }
}
public class MojeTridaEqualityComparer : IEqualityComparer<MyClass>
{
    public bool Equals(MyClass my1, MyClass my2)
    {
        if (my1 == null && my2 == null)
            return true;
        else if (my1 == null || my2 == null)
            return false;
        return my1.A == my2.A;
    }

    public int GetHashCode(MyClass my)
    {
        return my.A.GetHashCode();
    }
}
    static void Main(string[] args)
    {
        List<MyClass> myClass_1 = new List<MyClass>();
        myClass_1.Add(new MyClass() { A = "aaa", B = "bbb" });
        myClass_1.Add(new MyClass() { A = "aaa", B = "ccc" });
        myClass_1.Add(new MyClass() { A = "ggg", B = "haf" });
        myClass_1.Add(new MyClass() { A = "ggg", B = "mnau" });

        List<MyClass> myClass_2 = new List<MyClass>();
        myClass_2.Add(new MyClass() { A = "aaa", B = "bbb" });

        MojeTridaEqualityComparer mojeTridaEqualityComparer = new MojeTridaEqualityComparer();
        List<MyClass> myClass_3 = myClass_1
            .Except(myClass_2, mojeTridaEqualityComparer)
            .ToList();
    }

U mě to funguje tak, že v listu myClass3 zůstane pouze instance -"ggg""haf"-, ale myslím, že by tam měla zůstat i instance -"ggg""mnau"-.
Co dělám špatně? Nebo jsem tu funkci pochopil špatně?
Prosím o pomoc, děkuji.

Zkusil jsem: Bohužel nevím, co zkusit. Zkrátka nevím, zda-li je to chybka, nebo jestli dělám něco špatně.

Chci docílit: Rád bych tuto funkci využil k filtrování velkého množství dat, takže potřebuji správně chápat funkce, které pracují s množinami.

 
Odpovědět
6. září 18:06
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Tomáš M.
Člen
Avatar
Tomáš M.:6. září 21:17

Dobrý večer,
tak nakonec mi to nedalo, a ještě jsem poměrně zdlouhavě hledal řešení, které se nakonec podle mě dostavilo. Řešení jsem nalezl zde: Why Enumerable.Except() Might Not Work the Way You Might Expect

Je třeba nainstalovat balík ExtraLINQ, který obsahuje metodu Without(), která nahradí funkci Except(). To pak vede ke kýženému výsledku.
Jak jsem se totiž dočetl, tak metoda Except() vlastně dělá ještě Distinct(), kdežto Without() ne.
Omlouvám se za SPAM!

Akceptované řešení
+5 Zkušeností
Řešení problému
 
Nahoru Odpovědět
6. září 21:17
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 2 zpráv z 2.