C# 在数组中搜索对

C# 在数组中搜索对,c#,arrays,C#,Arrays,我有一个int数组,大小是8。我要做的是在数组中搜索配对(例如,如果索引0上的数字与索引5上的数字相同) 我试着制作两个数组(第二个数组是第一个数组的副本),但这没有意义,因为所有数组都是成对的 然后我尝试制作半个数组,所以我制作了两个大小为4的array,并对它们进行比较。这并没有解决成对可以在单个数组中的问题 要填充数组我使用的是随机数,随机数的最大值是数组的大小(8)如果最大值很小,可以初始化此长度的位数组。检查原始数组并为每个成员设置适当的位数组。如果此位置的位数组为真,则有一对。如果需

我有一个
int
数组,大小是
8
。我要做的是在
数组中搜索配对(例如,如果索引0上的数字与索引
5上的数字相同)

我试着制作两个数组(第二个数组是第一个数组的副本),但这没有意义,因为所有数组都是成对的

然后我尝试制作半个数组,所以我制作了两个大小为
4
array
,并对它们进行比较。这并没有解决成对可以在单个数组中的问题


要填充
数组
我使用的是随机数,随机数的最大值是
数组的大小
(8)
如果最大值很小,可以初始化此长度的位数组。检查原始数组并为每个成员设置适当的位数组。如果此位置的位数组为真,则有一对。如果需要特定位置,请使用int数组。
试着这样做:

BitArray bucket = new BitArray(<<your max value>>);
foreach(int i in originalArray)
{
if(bucket[i]) return true;
bucket[i] = true;
}
BitArray bucket=new BitArray();
foreach(原始阵列中的int i)
{
如果(bucket[i])返回true;
bucket[i]=真;
}
您可以使用LINQ

int[] array = new[] { 1, 2, 3, 1, 4, 5, 6, 7, 8, 8 };
var duplicates = array
    .GroupBy(i => i)
    .Where(g => g.Count() > 1)
    .Select(g => g.Key);
foreach (var d in duplicates)
    Console.WriteLine(d);

如果您不仅希望获得重复的值列表,还希望获得出现该值的索引,则可以使用LINQ to Objects查询:

int[] items = new[] { 1, 2, 3, 1, 4, 5, 3, 7 };

var duplicates = items.Select((e, i) => new { e, i })
                      .GroupBy(i => i.e)
                      .Where(g => g.Count() > 1)
                      .Select(g => new { Value = g.Key, Indexes = g.Select(e => e.i).ToList() })
                      .ToList(); 
duplicates
包含2个元素,包含以下内容:


您可以创建字典(如dict[i]=>索引数组)


查找对的传统方法是对数组进行排序(下面的方法A)。另一种方法是有两个嵌套循环(方法B)

Tell(“方法A…”);
int[]a=新的int[]{3,1,4,1,5,9,5,5};
int lengthA=a.长度;
数组。排序(a);
对于(int i=1;i
这是输出

  • 方法A
  • 方法A在A中找到一对:1和1
  • 方法A在A中找到一对:5和5
  • 方法A在A中找到一对:5和5
  • 方法B
  • 方法B在B中找到一对:1和1
  • 方法B在B中找到一对:5和5
  • 方法B在B中找到一对:5和5
  • 方法B在B中找到一对:5和5

我希望您能理解为什么方法B报告的成对数比方法A多。

不清楚您是在寻找特定的匹配项(在这种情况下,我希望索引5而不是4)还是任何重复项。
var dubs = array.Select((i, inx) => new { i, inx })
            .GroupBy(x => x.i)
            .ToDictionary(g => g.Key, g => g.Select(y => y.inx).ToList());
Tell("Method A...");
int[] a = new int[]{3, 1, 4, 1, 5, 9, 5, 5};
int lengthA = a.Length;
Array.Sort(a);
for (int i = 1; i < lengthA; i++)
{
  if (a[i-1] == a[i])
  {
    Tell("Method A Found pair in a: "+a[i-1]+" and "+a[i]);
  }
} // for i

Tell("Method B...");
int[] b = new int[]{3, 1, 4, 1, 5, 9, 5, 5};
int lengthB = b.Length;
for (int i = 0; i < lengthB-1; i++)
{
  for (int j = i+1; j < lengthB; j++)
  {
    if (b[i] == b[j])
    {
      Tell("Method B Found a pair in b: "+b[i]+" and "+b[j]);
    }
  } // for j
} // for i