如何使用全名c#快速匹配不同顺序的名称(fname,lname)

时间:2015-06-08 19:07:11

标签: c# linq compare

我有这个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可以是任何数据类型,不一定是列表。

3 个答案:

答案 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;