如何使用C#比较不同表示形式的Person的名称

时间:2012-04-16 12:49:57

标签: c#

我的情况是需要验证两个同名代表的比较。例如 让我们说 1 的名字被重新描述为

  

Person1Name = Venkata Phani Kumar Parimi

让我们说同一个人的名字 2 被重新描述为

  

Person2Name = Kumar Parimi Venkata Phani

还有一个场景是

  

John F. Kennedy = John Fitzgerald Kennedy

与以下情况相比,上述优先级更高。

  

John F. Kennedy = John Kennedy

即使在两个不同的上下文中,上述两个人也会向同一个人提供帮助。

如果有使用C#进行比较和确认姓名属于同一个人的方式,请告诉我

3 个答案:

答案 0 :(得分:0)

这是一个特定于上下文的问题,所以我认为你需要解决它。首先,实际上使两个名字相等?它是否以任何顺序包含相同的名称?那就是你需要检测的东西。可以有缩写吗?可以有像“太太”这样的头衔吗?如果有连字符的双重名称,会发生什么?我认为你的例子没有详细描述你所遇到的问题。在任何人为您提供算法之前,您需要提供更多相同且不相等的名称示例,以及为什么这些名称相等。

即。

  

John F. Kennedy = John Fitzgerald Kennedy?

     

先生。约翰肯尼迪=约翰肯尼迪?

如果你看一下不同的拼写,情况会变得更糟。

  

YayaTouré= Toure Yaya?

有了这些问题,问题很快变得非常复杂。如果你只需要比较两组相等而你可以忽略拼写,缩写,标题等,那么只需检查设置的交集。在c#-like伪代码

string[] names1 = name1.ToLowerInvariant().Split(' ');
string[] names2 = name2.ToLowerInvariant().Split(' ');

if (names1.Length != names2.Length)
   return false; // unequal, different number of names

foreach(name in names1)
   if (!names2.Contains(name))
       return false; // unequal, missing name

return true; // equal

答案 1 :(得分:0)

尝试使用SequenceEqual这正是它的工作:

  string s = "Subba Cargos";
  string s2 = "Cargos Subba";

  var isSame=  s.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries).
               OrderBy(o => o).SequenceEqual(s2.Split(new[] {' '}, 
                   StringSplitOptions.RemoveEmptyEntries).
               OrderBy(o => o));

答案 2 :(得分:0)

或者如果你喜欢简洁:

        var person1name = "Venkata Phani Kumar Parimi";
        var person2name = "Kumar Parimi Venkata Phani";

        var match = person1name.Split().All(p => person2name.Split().Contains(p))