为了账号安全,请及时绑定邮箱和手机立即绑定

如何在c#中查找或计算多维数组中的重复项

如何在c#中查找或计算多维数组中的重复项

C#
ibeautiful 2022-11-13 15:02:05
我在 c# 中创建一个二维 (3 * 3)数组,它必须计算或找到重复值int[,] arr = new int[3, 3] {   {1, 2, 6},   {4, 1, 5},   {6, 1, 8}};我预计输出有1并且6是重复值for仅适用于带循环的初学者
查看完整描述

3 回答

?
UYOU

TA贡献1878条经验 获得超4个赞

你可以试试HashSet<int>,例如


   int[,] arr = new int[3, 3] {

      {1, 2, 6 }, 

      {4, 1, 5 }, 

      {6, 1, 8 }

   };


   HashSet<int> unique = new HashSet<int>();


   foreach (var item in arr)

     if (!unique.Add(item))

       Console.WriteLine(item);  // Not unique, print it out

结果:


  1

  6

  1

如果我们想打印每个副本一次,我们可以添加另一个HashSet<int>:


   HashSet<int> unique = new HashSet<int>();

   HashSet<int> duplicates = new HashSet<int>();


   foreach (var item in arr)

     if (!unique.Add(item))

       duplicates.Add(item);  


   foreach (var item in duplicates)

     Console.WriteLine(item);

最后,如果您想计算重复出现的次数,我们可以更改HashSet<int> duplicates为Dictionary<int, int> duplicates:


   HashSet<int> unique = new HashSet<int>();


   Dictionary<int, int> duplicates = new Dictionary<int, int>();


   foreach (var item in arr)

     if (!unique.Add(item)) 

       if (duplicates.TryGetValue(item, out int count))

         duplicates[item] = count + 1;

       else

         duplicates[item] = 2; 


   foreach (var item in duplicates)

     Console.WriteLine($"{item.Key} appears {item.Value} times");

编辑:您可以将foreach循环更改为嵌套 for循环,例如:


所有重复项


   for (int i = 0; i < arr.GetLength(0); ++i)

     for (int j = 0; j < arr.GetLength(1); ++j)

       if (!unique.Add(arr[i, j]))

         Console.WriteLine(arr[i, j]); 

Distinct duplicates


   HashSet<int> duplicates = new HashSet<int>();


   for (int i = 0; i < arr.GetLength(0); ++i)

     for (int j = 0; j < arr.GetLength(1); ++j)

       if (!unique.Add(arr[i, j]))

         if (duplicates.Add(arr[i, j]))   // print distinct duplicate only

           Console.WriteLine(arr[i, j]); 

       


查看完整回答
反对 回复 2022-11-13
?
大话西游666

TA贡献1817条经验 获得超14个赞

或许是这样的:

var arr = new int[3, 3]{{1,2,6}, {4,1,5}, {6,1,8}};
var duplicates = arr
    .Cast<int>()
    .GroupBy(n => n)
    .Where(g => g.Count() > 1)
    .Select(g => g.Key)
    .ToArray();

.Cast<int>()使数组可用于 LINQ,.GroupBy(n => n)按值对数字进行分组,.Where(g => g.Count() > 1)计算组中的项目数,.Select(g => g.Key)仅返回组键 - 原始值。

.Where(g => g.Count() > 1).Select(g => g.Count())返回每个的计数,或者根据需要对组进行操作。


查看完整回答
反对 回复 2022-11-13
?
jeck猫

TA贡献1909条经验 获得超7个赞

效率不高,但您也可以将计数存储在字典中,然后打印计数大于 1 的键:


var counts = new Dictionary<int, int>();


for (int i = 0; i < arr.GetLength(0); i++)

{

    for (int j = 0; j < arr.GetLength(1); j++)

    {

        var number = arr[i, j];

        if (!counts.ContainsKey(number))

        {

            counts[number] = 0;

        }

        counts[number] += 1;

    }

}


foreach (var pair in counts)

{

    if (pair.Value > 1)

    {

        Console.WriteLine(pair.Key);

    }

}


// 1

// 6


查看完整回答
反对 回复 2022-11-13
  • 3 回答
  • 0 关注
  • 168 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信