2016-06-30 3 views
2

У меня есть процесс, который при запуске выводит уникальный идентификатор int и двойное значение, которое может не обязательно быть уникальным). Например:Сортировка идентификатора по значению и формирование строки

ID, Value 23, 56000 25, 67000 26, 67000 45, 54000

Я должен захватить эти и ранжировать идентификаторы путем за счет увеличения значения (меньше, чтобы больше), а затем сформируйте строку формы: id1, id2, id3 и т. д. Таким образом, в случае выше выход будет равен: 45; 26; 25; 23

Идентификационный номер не будет. скажем, 10 за проход.

Мой подход заключался в использовании хеш-таблицы для захвата значений. Код для сортировки ниже:

/// <summary> 
    /// Converts a hashtable (key is the id; value is the amount) to a string of the 
    /// format: x;y;z; where x,y & z are the id numbers in order of increasing amounts 
    /// cf. http://stackoverflow.com/questions/3101626/sort-hashtable-by-possibly-non-unique-values for the sorting routine 
    /// </summary> 
    /// <param name="ht">Hashtable (key is id; value is the actual amount)</param> 
    /// <returns>String of the format: x;y;z; where x,y & z are the id numbers in order of increasing amounts</returns> 
    public static string SortAndConvertToString(Hashtable ht) 
    { 
     if (ht.Count == 1) 
      return ht.Keys.OfType<String>().FirstOrDefault() +";"; 

     //1. Sort the HT by value (smaller to bigger). Preserve key associated with the value         
     var result = new List<DictionaryEntry>(ht.Count); 
     foreach (DictionaryEntry entry in ht) 
     { 
      result.Add(entry); 
     } 
     result.Sort(
      (x, y) => 
      { 
       IComparable comparable = x.Value as IComparable; 
       if (comparable != null) 
       { 
        return comparable.CompareTo(y.Value); 
       } 
       return 0; 
      }); 

     string str = ""; 
     foreach (DictionaryEntry entry in result) 
     { 
      str += ht.Keys.OfType<String>().FirstOrDefault(s => ht[s] == entry.Value) + ";"; 
     } 

     //2. Extract keys to form string of the form: x;y;z; 
     return str; 
    } 

Я просто интересно, это наиболее эффективные способы ведения дел или есть более быстрый способ. Комментарии/предложения/примеры кода были высоко оценены. Спасибо. J.

+0

Ваш пример вывода неверен. Это должно быть «45; 23; 26; 25». –

ответ

4

Вы можете сделать это довольно просто, используя некоторые LINQ и строковые утилиты:

public static string SortAndConvertToString(Hashtable ht) 
{ 
    var keysOrderedByValue = ht.Cast<DictionaryEntry>() 
     .OrderBy(x => x.Value) 
     .Select(x => x.Key); 

    return string.Join(";", keysOrderedByValue); 
} 

См this fiddle для рабочего демо.

Я бы предположил, что вы используете общий Dictionary<int, double>, а не Hashtable. См. this related question.

Смежные вопросы