我有两个与我正在尝试做的事情相关的课程。
第一类:人
第 2 类:个人资料
人员具有地址、姓名、电话号码等属性...
在我的 Personal Profiles 类中,我有一个 List,用于存储已创建的 Person 的信息。
我的问题:如果我想找出地址:999 Candy Lane 的人是否存在于列表中,我是否需要为除指定地址之外的所有内容创建一个具有默认值的新人,然后在我的 .Exists 或 .Exists 中使用它。包含?或者我不应该仅仅为搜索功能创建一个新对象。
为什么不使用 Linq:
theList.Where(x => x.address == "999 Candy Lane").First();
如果您使用 .net 3.5+,您可以使用 linq 查询:即
var result = (from p in Profiles where p.Address=="bla bla" select p).FirstOrDefault();
如果没有找到匹配的人,结果将为空。
鉴于缺失值的可能性很高,最好使用 FirstOrDefault。当然 First 和 FirstOrDefault 需要一个谓词,所以不需要使用 Where
var result = List.FirstOrDefault(x => x.Address == "999 Candy Lane");
if(result != null)
{
......
}
不,您不必为搜索创建新对象:
Person person = profiles.PersonsList.Where(p => p.Address == "Address here")
.Select(p => p);
您可能想使用 linq 和 lambda:
var candyLane = Persons.Where(x => x.Address == "999 Candy Lane").ToList();
这样做是提供一个 lambda 谓词用作选择器。把它想象成一个这样指定的匿名函数:
public bool CandyLaneChecker(x){
return x.Address == "999 Candy Lane";
}
其中大括号和 return 关键字被替换为 a=>
并且public bool CandyLaneChecker
省略了,因为这是一个匿名函数。那会离开(x) => x.Address == "999 Candy Lane"
,我们可以在原始谓词中留下括号,但不需要它们。
或者,可以使用 linq 表达式,例如:
var candyLane = (from p in persons
where p.Profile.Address == "999 Candy Lane"
select p).ToList();
这看起来更像是一个数据库查询,并且对某些人来说更容易理解。
linq 表达式的优点在于您甚至可以将相同的表达式用于 XML。