将多个条件传递给LINQ FirstOrDefault方法

时间:2016-06-30 13:52:56

标签: c# linq geolocation

我有gelolocations的列表。我想在列表上执行2个条件并选择满足这些条件的条件。我无法弄清楚如何做到这一点。

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

我想在此列表geolocationList上执行多个条件。

我想在FirstOrDefault属性与提供的属性匹配且Longitude,lattitude不为null的条件下使用此列表中的PostCode

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

我想在外部构建此conditions并将其作为参数传递给FirstOrDefault。例如建立一个Func<input, output>并将其传递给。{/ p>

4 个答案:

答案 0 :(得分:2)

你已经给出了自己的答案:

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

答案 1 :(得分:2)

FirstOrDefault可以采用复杂的lambda,例如:

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

答案 2 :(得分:0)

感谢您的回复。它帮助我以正确的方式思考。

我确实喜欢这个。

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

它工作正常,代码更好。

答案 3 :(得分:0)

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

谓词类型:System.Func测试每个函数的函数   条件的元素。

因此,您可以使用获取TSource并返回bool

的任何Func
//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);