我已经创建了一个匹配的方法,基本上在Person
对象,调用一个地址服务,然后尝试做一个匹配首先尝试像like然后如果这不起作用,它将房屋名称/号码与saon
信息(平面1a等)连接起来,看看是否有效。通过检查,如果不为空仍然分配为空
如果它找到了一个匹配,我需要将匹配的地址存储在我的变量matchingAddress
中,然后进一步处理该方法的其余部分,我为了清晰起见将其排除在外。
问题
我想我有我的lamda
语句的问题,在第二IF
与我同if语句返回true,我拖放到指定代码但它是调试的人即使IF
声明旨在检查它不是null
,也会设置为空。
任何人都可以解释这里发生了什么?
private void AttemptMatch(Person person, string username)
{
var postcode = person.Postcode;
List<JsonAddressModel> Addresses = _service.GetAddress(postcode); //returns a list of addresses for that persons postcode
JsonAddressModel matchingAddress = new JsonAddressModel();
//1.) Access the Service and see if theres a straight forward match
if (Addresses.FirstOrDefault(x => x.paon.Trim() == person.AddressLineOne && x.thorofare.Trim() == person.AddressLineTwo) != null)
{
matchingAddress = Addresses.First(x => x.paon.Trim() == person.AddressLineOne && x.thorofare.Trim() == person.AddressLineTwo);
}
//2.) try and combine the paon and saon and see if that matches address line one
if (Addresses.Where(x => String.Format("{0} {1}", x.paon.Trim(), x.saon.Trim()) == person.AddressLineOne && x.thorofare.Trim() == person.AddressLineTwo) != null)
{
matchingAddress = Addresses.Where(x => String.Format("{0} {1}", x.paon.Trim(), x.saon.Trim()) == person.AddressLineOne && x.thorofare.Trim() == person.AddressLineTwo).FirstOrDefault();
}
if (matchingAddress != null)
{
//rest of method to complete matching process for matched person
}
else
return;
}
我应该说List.Where或List.FirstOrDefault? – JsonStatham 2015-04-01 13:42:40
如果'FirstOrDefault'调用没有自己的lambda,那么'Where''后面跟'FirstOrDefault'可以总是(我认为)被合并为一个'FirstOrDefault'调用 - 很容易(如这里)在哪里并且将其lambda放在'FirstOrDefault'中),或者如果两个lambda必须被组合,则需要更多努力。有些工具(比如Resharper)甚至会在你写'Where().FirstOrDefault()'时提醒你。 –
2015-04-01 13:55:23
Resharper会为您解答;)。它表明,每次链接一个Where和First [OrDefault]或Single [OrDefault] – Juan 2015-04-02 16:25:14