C# 如何使用C比较不同表示形式的人名#
我有一个场景,需要验证相同名称的两个表示的比较。例如 假设人名1表示为 Person1Name=Venkata Phani Kumar Parimi 假设同一个人的名字2表示为 Person2Name=Kumar Parimi Venkata Phani 还有一种情况是 约翰·肯尼迪=约翰·菲茨杰拉德·肯尼迪 与以下情况相比,上述情况具有更高的优先级 约翰·肯尼迪=约翰·肯尼迪 即使在两种不同的语境中,上述两个人也指同一个人C# 如何使用C比较不同表示形式的人名#,c#,C#,我有一个场景,需要验证相同名称的两个表示的比较。例如 假设人名1表示为 Person1Name=Venkata Phani Kumar Parimi 假设同一个人的名字2表示为 Person2Name=Kumar Parimi Venkata Phani 还有一种情况是 约翰·肯尼迪=约翰·菲茨杰拉德·肯尼迪 与以下情况相比,上述情况具有更高的优先级 约翰·肯尼迪=约翰·肯尼迪 即使在两种不同的语境中,上述两个人也指同一个人 请告诉我是否有一种方法可以使用C#来比较和确认姓名属于同一个人这是一个
请告诉我是否有一种方法可以使用C#来比较和确认姓名属于同一个人这是一个非常特定于上下文的问题,因此我认为您需要解决这个问题。首先,究竟是什么使两个名字相等?它是否以任何顺序包含相同的名称?那么这就是你需要检测的。有缩写吗?可以有“夫人”这样的头衔吗?如果有带连字符的双重名称,会发生什么?我认为你的例子没有足够详细地描述你的问题。在任何人向您提供算法之前,您需要提供更多相等和不相等名称的示例,以及这些名称相等的原因 i、 e 约翰·肯尼迪=约翰·菲茨杰拉德·肯尼迪 约翰·肯尼迪先生=约翰·肯尼迪 如果你看不同的拼写,情况会更糟 雅雅旅游=雅雅旅游 有了这些问题,问题很快变得非常复杂。如果您只需要比较两个集合是否相等,并且可以忽略拼写、缩写、标题等,则只需检查集合的交点即可。在类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
尝试使用
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));
或者如果你喜欢简洁:
var person1name = "Venkata Phani Kumar Parimi";
var person2name = "Kumar Parimi Venkata Phani";
var match = person1name.Split().All(p => person2name.Split().Contains(p))
你可能需要对这个问题有一个更好的定义。两个名字可以指不同的人,即使名字是相同的。@ PooG:我不是在这个时间点考虑这个问题。@丹尼拉·怀特:我试图用列表来实现这一点,这是一个很糟糕的选择,也错过了新添加的ScEnRio…@ PhanikuMARPV。但我的观点是:如何定义两个名字指同一个人的测试?在回答您的问题时,最重要的问题是定义规定比较逻辑的规则。我们不能为你这样做,因为我们不知道更大的背景。一旦定义了规则,编写代码很可能是微不足道的,但这是我们可以帮助的。感谢您为我指出遗漏的场景。用场景信息更新了Q。