-1

我有一个场景,需要验证两个同名表示的比较。例如,假设人1的名称表示为

Person1Name= Venkata Phani Kumar Parimi

假设同一个人的名字2表示为

Person2Name= Kumar Parimi Venkata Phani

还有一种情况是

约翰·F·肯尼迪 = 约翰·菲茨杰拉德·肯尼迪

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

约翰·肯尼迪 = 约翰·肯尼迪

即使在两个不同的上下文中,上述两个人也指同一个人。

请让我知道是否有办法使用 C# 来比较和确认姓名属于同一个人

4

3 回答 3

0

这是一个非常具体的问题,所以我认为你需要这样解决它。首先,究竟是什么两个名字相等?它是否包含相同的名称,以任何顺序?那么这就是你需要检测的。可以有缩写吗?可以有“夫人”之类的称谓吗?如果有连字符的双重名称,会发生什么?我认为您的示例没有足够详细地描述您遇到的问题。您需要提供更多名称相等和不相等的示例,以及为什么这些名称相等,然后任何人才能为您提供算法。

IE

约翰·F·肯尼迪 = 约翰·菲茨杰拉德·肯尼迪?

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

如果您查看不同的拼写,情况会变得更糟。

亚亚图雷 = 图雷亚亚?

有了这些问题,问题很快就会变得非常复杂。如果您只需要比较两个集合的相等性并且您可以忽略拼写、缩写、标题等,那么只需检查集合交集。在类似 c# 的伪代码中

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

 
于 2012-04-16T13:01:13.837 回答
0

或者,如果您喜欢简洁:

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

        var match = person1name.Split().All(p => person2name.Split().Contains(p))
于 2012-04-16T13:16:01.570 回答
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));
于 2012-04-16T13:05:13.267 回答