如何快速匹配名字(fname, lname)以不同的顺序与全名c#
本文关键字:顺序 全名 lname 何快速 fname | 更新日期: 2023-09-27 17:54:30
我有这个linq查询,我试图优化。我想用一个快速的常量(最好)检索值来替换这个查询。我想过一个双键字典,但我不知道fname和lname的顺序是什么。我想问一下是否有一种快速的方法来做到这一点。
我想取一个名字列表,通过它搜索fname-lname
(-
是分隔符)并返回所有与搜索的全名匹配的名称。这个名单可以是中等规模的。
var nameList = from p in listOfPeople
where ((p.lname+"-"+p.fname == fullName)
|| (p.fname+"-"+p.lname == fullname))
select p;
编辑:listOfPeople
可以是任何数据类型,不一定是列表。
下面是创建字典的方法。
var nameLookup = new Dictionary<Tuple<string,string>, List<Person>>();
foreach(var person in listOfPeople)
{
List<Person> people = null;
var firstLast = Tuple.Create(person.fname, person.lname);
if(nameLookup.TryGetValue(firstLast, out people))
{
people.Add(person);
}
else
{
nameLookup.Add(firstLast, new List<Person> { person });
}
// If the person's first and last name are the same we don't want to add them twice.
if(person.fname == person.lname)
{
continue;
}
var lastFirst = Tuple.Create(person.lname, person.fname);
if(nameLookup.TryGetValue(lastFirst, out people))
{
people.Add(person);
}
else
{
nameLookup.Add(lastFirst, new List<Person> { person });
}
}
那么你的查找将是
// split by the delimiter to get these if needed
var fullName = Tuple.Create(firstName, lastName);
List<Person> nameList = null;
if(!nameLookup.TryGetValue(fullName, out nameList))
{
nameList = new List<Person>();
}
保持名字和姓氏分开是很重要的,否则你必须选择一个分隔符,它不会显示名字或姓氏。连字符"-"可以是姓或名的一部分。如果分隔符保证不是名字或姓氏的一部分,您可以将Tuple.Create(x,y)
的使用替换为x + delimiter + y
,并将字典更改为Dictionary<string, List<Person>>
。
另外,使用List<Person>
作为字典值的原因是为了处理像"Gary William"answers"William Gary"是两个不同的人这样的情况。
在你的" p "定义中,我猜这是一个"People"类型,我会添加一个"FullName"属性,这将是你的比较器:
public string FullName {get {return fname + "-" + lname;}}
修改你的LINQ:Where string.Equals(p.FullName, fullName)
.
如果你真的想使用任何数据类型,这将包括字符串甚至数据表,我真的没有看到任何更好的方法比你的方式…
我用Stopwatch测试了一下,这似乎更有效一些
var nameList = from n in(
from p in listOfPeople
select new{FullName = p.fname +"-"+ p.lname}
)
where n.FullName==fullName
select n;