C# 计算n个变量之间的相等性,不检查每对变量

C# 计算n个变量之间的相等性,不检查每对变量,c#,C#,不确定这是否可能,不在N个变量之间进行完整比较 对于int或float,我可以使用简单的数学来计算数字是否相同;求和,除以元素数 但是如果我想检查3个变量是否包含相同的字符串,我不能使用这种方法。 可能是var1和var2相同,或者var3和var1相同,并且var2和var3可能相同。据我所知,除非对每个变量进行比较,否则无法知道该变量的内容是否相同 我错过了什么还是有更简单的方法 具有3个变量的示例: string var1 = "hello"; string var2 = "there";

不确定这是否可能,不在N个变量之间进行完整比较

对于int或float,我可以使用简单的数学来计算数字是否相同;求和,除以元素数

但是如果我想检查3个变量是否包含相同的字符串,我不能使用这种方法。 可能是var1和var2相同,或者var3和var1相同,并且var2和var3可能相同。据我所知,除非对每个变量进行比较,否则无法知道该变量的内容是否相同

我错过了什么还是有更简单的方法

具有3个变量的示例:

string var1 = "hello";
string var2 = "there";
string var3 = "hello";

if (var1 == var2 || var1 == var3 || var2 == var3)
    //got a duplicate
else
    //all are different
想象一下,要比较20个变量,编写一个比较语句需要花费很长时间


对我来说,这听起来像是一个搜索算法,我可以应用与排序二进制搜索相同的概念吗?

将它们放在一个集合中,这样你的生活就容易多了

一种微妙但有效的方法是使用
哈希集

string[]collection={var1,var2,var3};
var set=新的HashSet();
bool noDuplicate=collection.All(set.Add);

返回
true
如果可以添加该项,则返回该项不存在时的情况。因此,此集合不允许重复<代码>可枚举。所有将在第一个
false
时停止枚举。如果所有都是唯一的,所有都可以添加到集合中,
noDuplicate
将是
true

将它们放入一个集合中,那么您的生活就轻松多了

一种微妙但有效的方法是使用
哈希集

string[]collection={var1,var2,var3};
var set=新的HashSet();
bool noDuplicate=collection.All(set.Add);

返回
true
如果可以添加该项,则返回该项不存在时的情况。因此,此集合不允许重复<代码>可枚举。所有将在第一个
false
时停止枚举。如果所有元素都是唯一的,则可以将所有元素添加到集合中,
noDuplicate
将为
true

将所有元素放入列表,如果正常列表元素计数与dinstict相同,则只需进行比较:

string var1 = "hello";
string var2 = "there";
string var3 = "hello";
string[] values = new [] { var1, var2, var3 };
if (values.Length != values.Distinct.Count()) {
    // Got a duplicate.
} else {
    // All are different.
}

将所有元素放到列表中,如果正常列表元素计数与dinstict相同,则只需进行比较:

string var1 = "hello";
string var2 = "there";
string var3 = "hello";
string[] values = new [] { var1, var2, var3 };
if (values.Length != values.Distinct.Count()) {
    // Got a duplicate.
} else {
    // All are different.
}
编辑:

如果您只想知道是否存在重复项:

List<string> strings = new List<string>() { var1, var2, var3,var4,var5,var6 };

bool hasDupes = strings.Count != (new HashSet<string>(strings)).Count;
List strings=newlist(){var1,var2,var3,var4,var5,var6};
bool hasDupes=字符串。计数!=(新哈希集(字符串)).Count;
编辑:

如果您只想知道是否存在重复项:

List<string> strings = new List<string>() { var1, var2, var3,var4,var5,var6 };

bool hasDupes = strings.Count != (new HashSet<string>(strings)).Count;
List strings=newlist(){var1,var2,var3,var4,var5,var6};
bool hasDupes=字符串。计数!=(新哈希集(字符串)).Count;

您可以尝试以下方法:

List<string> l = new List<string>() {"a", "b", "a"};
bool isDuplicate = l.GroupBy(i => i).Any(x => x.Count() > 1);
List l=newlist(){“a”、“b”、“a”};
bool isDuplicate=l.GroupBy(i=>i).Any(x=>x.Count()>1);

您可以尝试以下方法:

List<string> l = new List<string>() {"a", "b", "a"};
bool isDuplicate = l.GroupBy(i => i).Any(x => x.Count() > 1);
List l=newlist(){“a”、“b”、“a”};
bool isDuplicate=l.GroupBy(i=>i).Any(x=>x.Count()>1);


尝试将它们添加到列表中。序列是否相同并不重要;虽然我看到了求和然后除以元素数的数学缺陷。5,5,5将得到15,除以3将匹配第一个变量(5),但如果序列为5,4,6,则情况相同;因为它会除以3,得到5,这是第一种情况,但这里没有重复的。试着把它们添加到列表中,序列是否相同并不重要;虽然我看到了求和然后除以元素数的数学缺陷。5,5,5将得到15,除以3将匹配第一个变量(5),但如果序列为5,4,6,则情况相同;因为它会除以3,得到5,这是第一种情况,但这里没有重复项,这似乎是最好的解决方案;它快速、简单,而且不需要编写太多代码。谢谢,如果只有第一个元素有重复项,不进行此检查吗?@DovydasSopa:当然,所以我修改了我的答案:)@newbiez:是的,您可以将集合传递给
HashSet
的构造函数。所以另一种方法是使用
var set=newhashset(collection);bool noDuplicate=collection.Length==set.Count。但是我更喜欢LINQ方法,因为它在发现重复项时就停止了。或者您是否询问
哈希集
是否支持语法?是的,确实如此。这似乎是最好的解决方案;它快速、简单,而且不需要编写太多代码。谢谢,如果只有第一个元素有重复项,不进行此检查吗?@DovydasSopa:当然,所以我修改了我的答案:)@newbiez:是的,您可以将集合传递给
HashSet
的构造函数。所以另一种方法是使用
var set=newhashset(collection);bool noDuplicate=collection.Length==set.Count。但是我更喜欢LINQ方法,因为它在发现重复项时就停止了。或者您是否询问
哈希集
是否支持语法?是的,谢谢;尽管这样有两种操作:一种是添加到列表中,另一种是搜索每个重复项。不确定distinct函数在内部是如何工作的,但这似乎有复杂性2n@newbiez它将等同于TimSchmelter的解决方案-。@Eugene Podskal它并不完全等同。TimSchmelter的解决方案将在发现第一个副本时停止。此解决方案需要遍历所有项目。@DovydasSopa是的,我的意思是它不是O(n*n),而是摊销O(n)。在内部,它使用“散列”集合,尽管它必须遍历所有项;尽管这样有两种操作:一种是添加到列表中,另一种是搜索每个重复项。不确定distinct函数在内部是如何工作的,但这似乎有复杂性2n@newbiez它将等同于TimSchmelter的解决方案-。@Eugene Podskal它并不完全等同。蒂姆施梅尔特