IEqualityComparer

0

Hej!
Chcę zrobić IEqualityComparer, który nie będzie czuły na wielkość znaków. Zrobiłem coś takiego:

public class MojComparer : IEqualityComparer<Char>
    {
        public bool Equals(Char x, Char y)
        {
            return x.ToString().ToLower() == y.ToString().ToLower();
        }

        public int GetHashCode(Char obj)
        {
            return obj.GetHashCode();
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            string t = "Krzesło";
            MojComparer c = new MojComparer();
            Console.WriteLine(t.Contains("krz", c));    
            Console.ReadKey();

        }
    }

i zwraca mi błąd, w czasie kompliacji przy:

   Console.WriteLine(t.Contains("krz", c)); 
Error	1	The type arguments for method 'System.Linq.Enumerable.Contains<TSource>(System.Collections.Generic.IEnumerable<TSource>, TSource, System.Collections.Generic.IEqualityComparer<TSource>)' cannot be inferred from the usage. Try specifying the type arguments explicitly.	

Ma ktoś jakiś pomysł jak mam to poprawić? pzdr

1

kompilator nie wie jaki jest typ parametru generycznego (nie domyśla się)
Jeśli chodzi o błąd to dodaj <char> przy wywołaniu metody zwracającej błąd (przed nawiasami).
I napisz co się stanie bo na to że podziała masz małe szanse ;).

0

Kombinowałem już tak. Dodawałem i char i string i nadal nie działa.

Po zmianie:

t.Contains<char>("krz", c)

Występują 3 błędy:

Error	1	Instance argument: cannot convert from 'string' to 'System.Linq.IQueryable<char>
Error	2	'string' does not contain a definition for 'Contains' and the best extension method overload 'System.Linq.Queryable.Contains<TSource>(System.Linq.IQueryable<TSource>, TSource, System.Collections.Generic.IEqualityComparer<TSource>)' has some invalid arguments	
Error	3	Argument '2': cannot convert from 'string' to 'char'	

A po zmianie:

t.Contains<string>("krz", c)

Następujące 3 błędy:

Error	1	'string' does not contain a definition for 'Contains' and the best extension method overload 'System.Linq.Enumerable.Contains<TSource>(System.Collections.Generic.IEnumerable<TSource>, TSource, System.Collections.Generic.IEqualityComparer<TSource>)' has some invalid arguments	
Error	2	Instance argument: cannot convert from 'string' to 'System.Collections.Generic.IEnumerable<string>'	
Error	3	Argument '3': cannot convert from 'ConsoleApplication35.MojComparer' to 'System.Collections.Generic.IEqualityComparer<string>'	

Niejasne są dla mnie te komunikaty

0

wiec tak:
na obiekcie typu string masz metode Contains(string value) i tylko taka
teraz string implementuje IEnumerable<char>, wiec masz za pomoca rozszerzen dostepne:
Contains<char>(char value)
Contains<char>(char value, IEqualityComparer<char> comparer)

wiec slusznie ze na t.Compare<char>("bla", new MyComparer()) sie awanturuje VS bo pierwszy parametr to string a nie char!!!

zmiana Contains<string> nic nie da, bo obiekt string nie implamanetuje IEnumerable<string>, ani nie ma takiej konwersji

wiec napisales poprawny comparer, ale nie umiesz go wlasciwie uzyc
powstaje pytanie jaka byla szersza intencja tego rozwiazania?

chcesz porownac dwa stringi ale z pominieciem zwracania uwagi na wielkosc liter?
jesli tak zaimplementuja klase dziedziczaca po StringComparer

0

Podejrzewam, ze autor chce osiagnac to co pokazal na poczatku: sprawdzac, czy dany podciag pasuje case-insensitive

Po pierwsze, nie:
public bool Equals(Char x, Char y) { return x.ToString().ToLower() == y.ToString().ToLower(); }
tylko:
public bool Equals(Char x, Char y) { return Char.ToLower(x) == Char.ToLower(y); }
mam nadzieję, że nie muszę tłumaczyć czemu tak, i czemu powinienes przestac uważać ".ToString()" za rozwiazanie dobre na wszystko co sie tyczy liter.

Po drugie, nie trzeba pisac wlasnego IEqCmp, chociaz fakt, dziwi ze nie ma przeciazen dla contains-string ktore by go przyjmowaly.. Zeby sprawdzac czy podciagu wystepuje z pominieciem wielkosci liter, wystarczy:
if(-1 != t.IndexOf("krz", StringComparison.CurrentCultureIgnoreCase)
zapakuj to sobie dla wygody w extension method nazwane np. ContainsCaseIns..

-chyba, ze faktycznie chcesz miec comparer z jakiegos innego powodu?

1 użytkowników online, w tym zalogowanych: 0, gości: 1