Avatar billede AP_Pedersen Nybegynder
21. juni 2011 - 14:54 Der er 5 kommentarer og
1 løsning

Where filtrering i List<>

Hej eksperter

Jeg har en liste af Cars bundet op med et gridview (Winforms). Jeg har en textbox hvor jeg fanger textChanged eventen og når den fyrer kalder jeg:

        private void Search()
        {
            gvCars.DataSource =
                _carSync.Cars.Where(
                    p =>
                    (p.Registreringsnummer.ToUpper().Contains(txtSearch.Text.ToUpper()) ||
                    p.FabrikatNavn.ToUpper().Contains(txtSearch.Text.ToUpper()) ||
                    p.ModelNavn.ToUpper().Contains(txtSearch.Text.ToUpper()) ||
                    p.VariantBetegnelse.ToUpper().Contains(txtSearch.Text.ToUpper()
                    )));

        }

Det fungerer som sådan rigtig fint, men det crasher (selvfølglig) hvis en af de properties jeg filtrerer på er null (og de kan alle være null).

Ved I hvordan jeg kan gøre noget lignende bare hvor det ikke fejler hvis et felt er null?

(en række med null i registreringsnummer skal stadig komme med ud hvis der søges på FabrikatNavn osv.)
Avatar billede mcb2001 Nybegynder
21. juni 2011 - 14:59 #1
groft sagt skal du bare "tjekke" for null først, og hvis ikke null, så tjek for værdi:

(
p.Registreringsnummer != null && p.Registreringsnummer.ToUpper().Contains(txtSearch.Text.ToUpper())
)
||
(
p.FabrikatNavn != null && p.FabrikatNavn.ToUpper().Contains(txtSearch.Text.ToUpper())
)
......
Avatar billede AP_Pedersen Nybegynder
21. juni 2011 - 15:22 #2
Årh mand, jeg var så tæt på, men havde bare misset et par paranteser!

Tusind tak for det meget hurtige svar!

Jeg er ny herinde - hvordan smider jeg point din vej?
Avatar billede mcb2001 Nybegynder
21. juni 2011 - 15:27 #3
du tildeler dem til mit svar (dette)

Reglen er at der først lægges et svar når man har modtaget et brugbart resultat. Du tildeler så point efter hvem der har hjulpet. Så er det f.eks. 2 der har hjulpet, men en mere end den anden, så tildeler du f.eks. 10 til den ene og 20 til den anden.
Avatar billede AP_Pedersen Nybegynder
21. juni 2011 - 15:41 #4
Perfekt, tak igen. :)
Avatar billede janus_007 Nybegynder
21. juni 2011 - 18:09 #5
Du kan også istedet for alt det null-check lave din egen comparer :)

sådan:
public class StringCompare:IEqualityComparer<string>
    {
        public bool Equals(string x, string y)
        {
            if((x == null) || (y == null))
                return false;

            return x.ToUpperInvariant() == y.ToUpperInvariant();
        }

        public int GetHashCode(string obj)
        {
            return obj.GetHashCode();
        }
    }

Og så når du bruger den:
p.Registreringsnummer.Contains(txtSearch.Text, new StringCompare())

Nemmere at se hoved og hale i synes jeg :)

Vær dog opmærksom på at den ikke kan komme ned på sql-niveau, men din contains er heller ikke null-følsom på det niveau :)
Avatar billede arne_v Ekspert
25. juni 2011 - 17:24 #6
Det simple test for null maa vaere den rigtige losning.

Janus's loesning er interessant, men der er ikke en String.Contains(String,IEqualityComparer<string>) metode. Jeg formoder at der var taenkt paa IEnumerable<String>.Contains(String,IEqualityComparer<string>), hvilket er en lidt anden kontekst.

Generelt fraraader man brug af .ToUpper til sammenligning (.ToUpperInVariant fra Janus's kode maa dog vaere bedre end .ToUpper).

Der er StringComparison.CurrentCultureIgnoreCase / StringComparison.InvariantCultureIgnoreCase til formaalet. Disse kan dog ikke angives i String.Contains, men de kan i String.IndexOf, saa i.s.f.:

s1.ToUpper().Contains(s2.ToUpper())

maaske:

s1.IndexOf(s2, StringComparison.InvariantCultureIgnoreCase) >= 0
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester