如何浏览数组并创建一个列表来计算重复数字的次数

时间:2017-06-18 11:14:56

标签: c# arrays list replace tuples

论坛的朋友。

首先,我为我的英语道歉

如何浏览数组并创建一个列表来计算一个数字重复的次数,并按项目2从最高到最低排序。

我有以下数组:

int[] arrayNumeros= new int[10] {1,2,3,4,5,6,1,1,2,3}

我有以下列表:

List<Tuple<int, int>> contadorNumerosTotal = new List<Tuple<int, int>>();

这是我的代码:

for (int i = 0; i < arrayNumeros.Length; i++)
    {
         if (contadorNumerosTotal.Any(t => t.Item1 == arrayNumeros[i]))                    
         {
             //if the number exists I want item2 to be incremented by 1.
         }else{
              contadorNumerosTotal.Add(new Tuple<int, int>(arrayNumeros[i], 1));
         }
}



    for (int i = 0; i < contadorNumerosTotal.Count; i++)
    {
      System.Diagnostics.Debug.WriteLine(contadorNumerosTotal[i].Item1 +" -> "+ contadorNumerosTotal[i].Item2);                   
    }

结果它应该显示:

1 -> 3
3 -> 3
2 -> 2
4 -> 1
5 -> 1
6 -> 1

非常感谢你的时间

3 个答案:

答案 0 :(得分:0)

以下内容应产生预期效果:

int[] numbers = new int[] {1,2,3,4,5,6,1,1,2,3};

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

int len = numbers.Length;
for(int i = 0; i < len; i++)
{
    if (numberCount.ContainsKey(numbers[i]))
    {
        numberCount[numbers[i]]++;
    }
    else
    {
        numberCount[numbers[i]] = 1;
    }
}

// Sort by value if necessary. Otherwise loop through numberCount.
var sortednumberCount = numberCount.OrderByDescending(pair => pair.Value);
foreach (var number in sortednumberCount)
{
    Console.WriteLine("{0} -> {1}", number.Key, number.Value);
}

输出:

1 -> 3
2 -> 2
3 -> 2
4 -> 1
5 -> 1
6 -> 1

答案 1 :(得分:0)

您可以使用以下内容:

List<Tuple<int, int>> contadorNumerosTotal =
    arrayNumeros.GroupBy (i => i).Select (ints => new Tuple<int, int> (ints.Key, ints.Count ())).ToList ();
contadorNumerosTotal.Sort ((tuple, tuple1) => tuple1.Item2.CompareTo (tuple.Item2));

这将元素组arrayNumeros除以数字的值并转换列表,以便它包含值(这是组的键)和值的计数(这是计数组)。最后,它会对从计数中降序的列表元素进行排序(您可以通过将tuple的Item2与tuple1的Item2进行比较而不是相反的方式对其进行排序。

你可以打印出这样的结果:

int [] arrayNumeros = new int[10] {1, 2, 3, 4, 5, 6, 1, 1, 2, 3};
List<Tuple<int, int>> contadorNumerosTotal =
    arrayNumeros.GroupBy (i => i).Select (ints => new Tuple<int, int> (ints.Key, ints.Count ())).ToList ();
contadorNumerosTotal.Sort ((tuple, tuple1) => tuple1.Item2.CompareTo (tuple.Item2));
foreach (var count in contadorNumerosTotal)
    Console.WriteLine ($"{count.Item1} -> {count.Item2}");
Console.ReadLine ();

结果如下:

1 -> 3
2 -> 2
3 -> 2
4 -> 1
5 -> 1
6 -> 1

详细了解groupBy here

答案 2 :(得分:0)

int[] arrayNumeros= new int[10] {1,2,3,4,5,6,1,1,2,3};

var result = arrayNumeros
    .GroupBy( e => e )
    .ToDictionary( e => e.Key, e => e.Count() )
    .OrderByDescending( e => e.Value )
    .ThenBy( e => e.Key )
    .Select( e => Tuple.Create( e.Key, e.Value ) )
    .ToList();

.net fiddle sample