2015-08-24 2 views
3

Скажем у меня есть списокGroup список значений по KeyValuePair

[1,2,2,1,3,3,3,2,3,3,1,3,3,2,3] 

enter image description here

Любые идеи, как группировать их (List<KeyValuePair<int, int>>), так что ключ является следующим наименьшим цифра, и стоимость является следующая большая цифра и если она повторяется, группа его с тем же наименьшим ключом, если это имеет смысл ...

Это вывод, который я ищу:

[Key, Value] 
[0,1] 
[0,2] 
[3,4] 
[3,5] 
[3,6] 
[7,8] 
[7,9] 
[10,11] 
[10,12] 
[13,14] 
+4

Вы что-то пробовали? –

+0

Вы можете использовать 'SortedList >'. Когда вам нужно выводить - просто перебирайте все ключи (не забудьте использовать метод List.Sort перед запуском итерации. Если вы хотите, я могу легко обмениваться фрагментом – Nissim

+0

для цикла foreach, тогда если инструкции для проверки + 1 или -1, основанный на текущем индексе, который отлично работает, если нет одинаковых номеров больше, чем 2 смещения влево или вправо. Я попытался запустить цикл while для каждого индекса, чтобы найти минимальное значение, но у меня проблемы с этим – wtz

ответ

1

На основе изображения и пример ввода:

 var list = new List<int> { 1, 2, 2, 1, 3, 3, 3, 2, 3, 3, 1, 3, 3, 2, 3}; //example input 

     var results = new List<KeyValuePair<int, int>>(); 
     int key = 0; 
     for (int i = 0; i < list.Count; i++) 
     { 
      if(i==0 || list[i] < list[i - 1])     
       key = i++; //assign key and proceed to next index (NB no index out of range checking)     
      results.Add(new KeyValuePair<int, int>(key, i)); 
     } 

При этом используется прямое сравнение с предыдущим элементом и использует индексы в качестве ключа и значений, как и в примере вывода. Если ключевое значение всегда меньше, чем предыдущий элемент, как в описании, можно заменить, если с: if(i==0 || list[i] < list[i - 1])

редактировать сделал Кортеж KeyValuePair

+0

Вы правы, значение ключа всегда меньше предыдущего элемента. Спасибо за это. Это работает :) – wtz

1
private static void foo() 
    { 
     SortedList<int, List<int>> collection = new SortedList<int, List<int>>(); 
     Random rnd = new Random(); 

     // Filling the collection with random keys/values: 
     for (int i = 0; i < 100; i++) 
     { 
      int key = rnd.Next(0, 10); 
      if (!collection.ContainsKey(key)) 
       collection.Add(key, new List<int>()); 
      for (int j = 0; j < 10; j++) 
      { 
       int value = rnd.Next(0, 1000); 
       collection[key].Add(value); 
      } 
     } 

     // Displaying all pairs: 
     foreach (var key in collection.Keys) 
     { 
      collection[key].Sort(); 
      for (int j = 0; j < collection[key].Count; j++) 
       Console.WriteLine(string.Format("[{0},{1}]", key, collection[key][j])); 
     } 
    } 
1

Попробуйте

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      List<int> input = new List<int>() { 1, 2, 2, 1, 3, 3, 3, 2, 3, 3, 1, 3, 3, 2, 3 }; 
      int previous = 0; 
      int keyIndex = 0; 
      Dictionary<int, List<int>> dict = new Dictionary<int, List<int>>(); 
      for (int i = 0; i < input.Count; i++) 
      { 
       if (i == 0) 
       { 
        keyIndex = 0; 
       } 
       else 
       { 
        if (input[i] < previous) 
        { 
         keyIndex = i; 
        } 
        else 
        { 
         if (dict.ContainsKey(keyIndex)) 
         { 
          dict[keyIndex].Add(i); 
         } 
         else 
         { 
          dict.Add(keyIndex, new List<int>(){ i}); 
         } 
        } 
       } 
       previous = input[i]; 
      } 

      foreach (int dictKey in dict.Keys) 
      { 
       var l = dict[dictKey]; 

       Console.WriteLine("Key:{0}, values={1}", dictKey, string.Join(",", dict[dictKey].Select(x => x.ToString()).ToArray())); 
      } 
      Console.ReadLine(); 

     } 
    } 
} 
​ 
1

Я надеюсь, что это решит вашу проблему.

public void GetPairs() 
{ 
    List<int> list = new List<int>() { 1,3,3,2,3,3,1,3,4,1 }; 

    List<KeyValuePair<int, int>> kvapar = new List<KeyValuePair<int, int>>(); 
    int prev = 0, firstIndex = 0, lastIndex = 0; 
    foreach (int i in list) 
    { 
      if (i < prev) 
      { 
       kvapar.AddRange(GetRange(list.GetRange(firstIndex, lastIndex))); 
       firstIndex += lastIndex; lastIndex = 0; 
      } 
      prev = i; lastIndex++; 
    } 
} 
public List<KeyValuePair<int, int>> GetRange(List<int> list) 
{ 
     List<KeyValuePair<int, int>> result = new List<KeyValuePair<int, int>>(); 
     foreach(int i in list) 
     { 
      if (list.IndexOf(i) == 0) continue; 
      result.Add(new KeyValuePair<int, int>(list[0], i)); 
     } 
      return result; 
} 
Смежные вопросы