假设我有5个整数。
int a = 1;
int b = 2;
int c = 5;
int d = 1;
int f = 1;
我想检查这5个整数中的3个是否相同。
我尝试了一些东西,但是它很长(500多行)并认为这不是一个好方法。
答案 0 :(得分:8)
首先将它们全部放在一个集合中,而不是使用单独的变量:
var numbers = new[]{a,b,c,d,f};
然后对它们进行分组,找到每个组的计数,看看是否符合您的标准。
var isLargeGroup = numbers.GroupBy(n => n, (key, group) => group.Count() )
.Any(count => count >= 3);
答案 1 :(得分:1)
对于大型集合(比如说10000个数字),其他两种解决方案都可能很昂贵,这会花费一个完整的枚举并创建许多将被垃圾收集的对象。试试这个,这可能会在完整的枚举之前很久就停止执行:
private bool AreNumbersTheSame(int[] numbers, int duplicateCount)
{
var numberCounts = new Dictionary<int, int>();
for (int i = 0; i < numbers.Length; i++)
{
var current = numbers[i];
if (!numberCounts.ContainsKey(current))
{
numberCounts[current] = 1;
continue;
}
if (numberCounts[current] == duplicateCount - 1)
{
return true;
}
numberCounts[current]++;
}
return false;
}
称之为:
var result = AreNumbersTheSame(new[] { a, b, c, d, f }, 3);
答案 2 :(得分:0)
对于它的价值,这里的另一个选项不如GroupBy
优雅,但如果序列很大则效率更高。隐藏在扩展方法中,可读性在我看来并不那么重要。
public static bool HasDuplicateCount<T>(this IEnumerable<T> seq, int maxCount)
{
Dictionary<T, int> counts = new Dictionary<T, int>();
foreach (T t in seq)
{
int count;
if (counts.TryGetValue(t, out count))
++count;
else
count = 1;
if (count == maxCount)
return true;
counts[t] = count;
}
return false;
}
您可以这样使用它:
bool threeDups = new[] { a, b, c, d, f }.HasDuplicateCount(3);
答案 3 :(得分:0)
这也可以使用Majority Vote算法解决,只要您想查看超过一半的元素是否相同(就像5个元素中的3个一样):
public static bool HasMajorityElement(int[] a)
{
int candidate = 0;
int count = 0;
foreach (int i in a)
{
if (count == 0)
{
candidate = i;
count = 1;
}
else
{
count += candidate == i ? 1 : -1;
}
}
count = 0;
foreach (int i in a)
{
if (i == candidate) ++count;
}
return count > a.Length / 2;
}
在ideone.com上
或者根据您的具体情况选择:
public static bool ThreeOutOfFive(int a, int b, int c, int d, int e)
{
return ((a==b?1:0)+(a==c?1:0)+(a==d?1:0)+(a==e?1:0) > 1)
|| ((b==c?1:0)+(b==d?1:0)+(b==e?1:0) > 1)
|| ((c==d?1:0)+(c==e?1:0) > 1);
}
答案 4 :(得分:0)
我会做以下事情: -
将所有数字添加到列表中。
创建一个字典,其数字为KEY,其出现为VALUE。
在迭代列表时,需要检查数字是否不在字典中,然后使用数字作为KEY添加它,将1作为其值添加。
如果号码重新出现,只需将字典值增加1。
一旦等于3,就会脱离循环。
int a = 1;
int b = 2;
int c = 5;
int d = 1;
int f = 1;
var listOfNumbers = new List<int> {a, b, c, d, f};
var dict = new Dictionary<int, int>();
foreach (var number in listOfNumbers)
{
if (dict.ContainsKey(number))
{
dict[number] = dict[number] + 1; //if a key repeats => increment the value by 1
if (dict[number] == 3)
break; //found the number
}
else
dict.Add(number, 1); //for first occurence of the key => initialize the value with 1
}