IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Tomáš M.
Člen
Avatar
Tomáš M.:6.9.2021 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.9.2021 18:06
Avatar
Tomáš M.
Člen
Avatar
Tomáš M.:6.9.2021 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.9.2021 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.