如何快速匹配名字(fname, lname)以不同的顺序与全名c#



我有这个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"one_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;

最新更新