我有这个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
可以是任何数据类型,不一定是列表。
答案 0 :(得分:2)
以下是创建词典的方法。
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>
作为字典值的原因是处理像“加里威廉”和“威廉加里”两个不同的人的情况。
答案 1 :(得分:-1)
在你的&#34; P&#34;定义,我猜它是&#34;人们&#34;类型,我会添加一个&#34; FullName&#34;属性,这将是你的比较器:
public string FullName {get {return fname + "-" + lname;}}
使用以下命令修改LINQ:
Where string.Equals(p.FullName, fullName)
。
如果您真的想要使用任何数据类型,包括字符串甚至DataTable,我真的不会看到比你做的更好的方式...
答案 2 :(得分:-1)
我用秒表测试,这看起来更有效
var nameList = from n in(
from p in listOfPeople
select new{FullName = p.fname +"-"+ p.lname}
)
where n.FullName==fullName
select n;