2015-01-21 4 views
2

Учитывая два списка ниже в C#:Сортировка списка на основе другого списка поплавка в C#

List<string> X = new List<string>({ "a", "b", "c", "d", "e", "f", "g", "h", "i"}); 
List<float> Y = new List<float> ({ 0.991f, 1.471f, 3.819f, 0.003f, 2.291f, 2.887f, 2.887f, 0, 1.0f}); 

Что будет чистейшим/коротким путем сортировки X с использованием значений с плавающей запятой от Y, чтобы получить следующий вывод?

"h", "d", "a", "i", "b", "e", "f", "g", "c" 

Порядок для элементов, имеющих один и тот же поплавок «ключ», не имеет значения.

ответ

1

Вот один из способов:

IEnumerable<string> sorted = X 
    .Select((value, index) => new { Index = index, Value = value }) 
    .OrderBy(o => Y[o.Index]) 
    .Select(o => o.Value); 

В основном:

  • Используйте .Select проецировать свой список (X) в новую последовательность анонимных объектов, который содержит строку из X и его индекс в пределах список.
  • Order the sequence по соответствующему значению в Y.
  • Выберите часть анонимного объекта Value, чтобы создать новую последовательность, содержащую только string s от X.

Пример:https://dotnetfiddle.net/ZjZvBR

+0

это просто работает! – purga

4

Если каждая клавиша строка является уникальной и каждый список идеально подходят, вы можете использовать их в качестве ключей в словаре, используя почтовый индекс от System.Reactive.

var dic = X.Zip(Y, (k, v) => new { k, v }) 
      .ToDictionary(x => x.k, x => x.v); 

Теперь соберите свой новообразованный словарь по значению.

var sortedDict = from entry in dic orderby entry.Value ascending select entry; 

В "однострочника", используя синтаксис запроса, это становится:

var dic = X.Zip(Y, (k, v) => new { k, v }) 
      .ToDictionary(x => x.k, x => x.v); 
      .OrderBy(x => x.Value); 
+0

очень аккуратный и очень элегантный. – purga

0

Следующий код следует метод сортировки пузырь ...

for(int i = 1; i < max; i++) 
{ 
    for(int j = 0; j < max - i; j++) 
    { 
     if(Y[j] > Y[j + 1]) 
     { 
      int temp = X[j]; 
      X[j] = X[j + 1]; 
      X[j + 1] = temp; 
      int temp1 = Y[j]; 
      Y[j] = Y[j + 1]; 
      Y[j + 1] = temp1; 
     } 
    } 
} 
Смежные вопросы