2016-06-30 16 views
1

Ich habe eine Liste von gelolocations. Ich möchte 2 Bedingungen auf der Liste ausführen und diejenigen auswählen, die diese Bedingungen erfüllen. Ich kann nicht herausfinden, wie das geht.mehrere Bedingungen an LINQ übergeben FirstOrDefault Methode

public class GeolocationInfo 
{ 
    public string Postcode { get; set; } 

    public decimal Latitude { get; set; } 

    public decimal Longitude { get; set; } 
} 

var geolocationList = new List<GeolocationInfo>(); // Let's assume i have data in this list 

Ich möchte geolocationList mehrere Bedingungen in dieser Liste durchzuführen.

Ich möchte FirstOrDefault auf dieser Liste unter den Bedingungen verwenden, die PostCode Eigenschaft entspricht mit der gelieferten und Länge, Breite sind nicht null.

geolocationList .FirstOrDefault(g => g.PostCode == "AB1C DE2"); 
// I want to add multiple conditions like g.Longitude != null && g.Lattitude != null in the same expression 

Ich möchte diese conditions außerhalb bauen und sie als Parameter an FirstOrDefault passieren. wie zum Beispiel ein Func<input, output> bauen und dieses in.

+1

Haben Sie versucht, Bedingungen in Kommentar innen FirstOrDefault setzen? – raidensan

+1

Ich habe es versucht und es funktioniert, aber mein Ziel ist es, nicht alle Bedingungen in den 'FirstOrDefault' zu bringen. Ich gab ein einfaches Beispiel für einen "Gleich" -Vergleich. Ich habe sehr komplexe Bedingungen. Sie sind definitiv nicht lesbar. Ich möchte einen Ausdruck mit diesen Bedingungen erstellen und sie in FirstOrDefault übergeben. – Venky

Antwort

0

Vielen Dank für Ihre Antwort Jungs. Es hat mir geholfen, richtig zu denken.

Ich habe das getan.

Func<GeolocationInfo, bool> expression = g => g.PostCode == "ABC" && 
               g.Longitude != null && 
               g.Lattitude != null; 
geoLocation.FirstOrDefault(expression); 

Es funktionierte und Code ist viel besser.

+0

Bitte markieren Sie eine Antwort für die Frage, ob das Problem behoben ist. – Nsevens

2

Sie haben Ihre eigene Antwort gegeben:

geoLocation.FirstOrDefault(g => g.Longitude != null && g.Latitude != null); 
1

FirstOrDefault eine komplexe Lambda nehmen können, zum Beispiel:

geolocationList.FirstOrDefault(g => g.PostCode == "ABC" && g.Latitude > 10 && g.Longitude < 50);

+0

Sie können sogar sneakier erhalten: 'geolocationList.FirstOrDefault (g => { if (g.PostCode.contains ("A")) { return true; // immer Postleitzahlen akzeptieren enthält "A" } return g.Latitude> 10; }) ' – daf

+0

Gibt es eine Möglichkeit, ich kann diesen Ausdruck außerhalb mit 'Func <>' erstellen und übergeben Sie es als Parameter zu 'FirstOrDefault' – Venky

+1

Wenn Sie nicht anonyme Funktion verwenden möchten, können Sie Versuchen Sie 'geolocationList.FirstOrDefault (g => IsParameterOk (g));' und dann 'bool IsParameterOk (GeolocationInfo g) {/ * Logik hier * /}' –

0
public static TSource FirstOrDefault<TSource>(
    this IEnumerable<TSource> source, 
    Func<TSource, bool> predicate 
) 

Prädikat Typ: System.Func Eine Funktion jedes Element für eine Bedingung zu testen.

So können Sie jede Func verwenden, die TSource bekommen und zurück bool

//return all 
Func<GeolocationInfo, bool> predicate = geo => true; 

//return only geo.Postcode == "1" and geo.Latitude == decimal.One 
Func<GeolocationInfo, bool> withTwoConditions = geo => geo.Postcode == "1" && geo.Latitude == decimal.One; 

var geos = new List<GeolocationInfo> 
{ 
    new GeolocationInfo(), 
    new GeolocationInfo {Postcode = "1", Latitude = decimal.One}, 
    new GeolocationInfo {Postcode = "2", Latitude = decimal.Zero} 
}; 

//using 
var a = geos.FirstOrDefault(predicate); 
var b = geos.FirstOrDefault(withTwoConditions); 
Verwandte Themen