2012-02-02 11 views
0

В принципе у меня есть и массив целых чисел, которые различаются по размеру. Мне нужно сравнить каждое число друг с другом и показать, какое число повторяется. Например:Массив целых чисел Сравнение целых чисел VB.NET

Dim ints() As Integer = {1,2,2,5,4,6} 

Число, которое появляется более одного раза 2.

Как я могу запустить через массив и сравнить каждое целое с числами в массиве. Я пробовал цикл for, но он не возвращал значение, которое я искал. Я новичок в VB.NET и не понимаю полностью.

+0

Вы можете добавить свой цикл? Тогда мы сможем дать подсказки о том, что неправильно. –

ответ

1
Dim ints() As Integer = {1,2,2,5,4,6} 

Dim repeatedNumbers = ints.GroupBy(Function(intValue) intValue) _ 
          .Where(Function(grp) grp.Count > 1) 

For each grp in repeatedNumbers 
    Console.WriteLine("Number {0} is repeated {1} times", grp(0), grp.Count) 
Next 

Что делает этот код:

  • Мы называем первую GroupBy, который группирует элементы по их стоимости. Функция получает ключ группировки, в этом случае мы просто группируем значение самого массива. Этот вызов возвращает последовательность групп. Для каждого уникального значения в массиве есть одна группа. Группа содержит все элементы, которые соответствуют уникальному значению. Поэтому, если в массиве дважды появляется значение, будет существовать группа, которая содержит два значения с этим значением.
  • Мы вызываем Где фильтровать группы. Нам нужны только группы, для которых число больше одного, поэтому учитываются только повторяющиеся значения.
  • Затем мы перебираем результат. grp (0) дает нам первое число в группе (мы могли бы выбрать любое число в группе, так как все числа в группе одинаковы!), а свойство Count дает нам количество повторений.
+0

Благодарим вас за ответ, это решение работает наилучшим образом. Мой вопрос в том, что такое 'Function (x)' и 'Function (grp)' Я просто хочу убедиться, что полностью понимаю, как я получаю то, что получаю. –

+0

Они являются лямбда-выражениями и обычно используются с функциями Linq, такими как GroupBy и Where. Проверьте следующую ссылку MSDN для лямбда-выражений: http://msdn.microsoft.com/en-us/library/bb531253.aspx –

+0

Я также отредактировал ответ, чтобы попытаться объяснить, что делает код. Надеюсь, поможет –

0

Я хотел бы попробовать что-то вроде этого:

Dim ints() As Integer = {1, 2, 2, 5, 4, 6} 
    Array.Sort(ints) 
    For i = 1 To ints.GetUpperBound(0) 
     If ints(i) = ints(i - 1) Then MessageBox.Show(String.Format("{0} is repeated", ints(i))) 
    Next 

Делая это, как это на отсортированном массиве держит вниз вложенности.

Я не тестировал это, но он должен быть вдоль правильных линий.

+1

Не плохое решение, но если число отображается более двух раз, вы увидите два сообщения или больше для этого номера. –

+0

Я пошел на все, чтобы все началось, но да, вы правы, это может быть более тонким. –

0

Вы можете использовать LINQ найти дубликаты:

Dim repeating = (From n In ints 
       Group By n Into Dups = Group 
       Where Dups.Count > 1 
       Select Dups.First).ToArray() 

Это возвращает массив целых чисел, которые содержатся только цифры, которые не являются уникальными в исходном массиве.

Таким образом, это показывает повторяющийся номер (ы):

MessageBox.Show(String.Format("Duplicates found: {0}", String.Join(","c, repeating)))