2012-10-09 6 views
0

У меня естьКак отсортировать список по значению в массиве

List<string> strs; 
double[] values; 

где values массив содержит значение каждой строки в strs списке

Say strs={"abc","def","ghi"} 
and values={3,1,2} 

это означает, что «а» имеют значение 3 и т. д.

Я хочу, чтобы отсортировать strs и valuesvalues по заказу, таким образом, что он становится

strs={"def","ghi","abc"} 
values={1,2,3} 

Есть ли простой способ для достижения этой цели?

+0

Лучше использовать словарь для Вашего случая , вместо двух списков –

+0

Почему бы не использовать словарь, если у вас есть такие сопоставления? –

+0

В качестве альтернативы, если вы не возражаете хранить оба массива в одном и том же объекте, вы можете использовать SortedList wes

ответ

2

Метод Array.Sort имеет перегрузку, принимает два массива и сортирует оба массива в соответствии со значениями в первом массиве, поэтому сделайте массив из списка:

string[] strsArr = strs.ToArray(); 

Тогда сортировка их не может быть проще:

Array.Sort(values, strsArr); 

А потом обратно в список, если вам нужно что:

strs = strsArr.ToList(); 
2

Вы можете использовать Enumerable.Zip, а затем отсортировать результат, а затем извлечь список строк.

Что-то вроде:

var result = strs.Zip(values, (first, second) => new Tuple<string, double>(first, second)) 
      .OrderBy(x => x.Item2) 
      .Select(x => x.Item1) 
      .ToList(); 
2
var sortedStrs = strs.Select((i, s) => new {Value = values[i], Str = s}) 
        .OrderBy(x => x.Value) 
        .Select(x => x.Str).ToList(); 

Если бы вы могли логически положить эти значения как свойства класса, таких как:

class NameAndOrder 
{ 
    public string Name; 
    public int Order; 
} 

Тогда было бы лучше и более организованным, и то вы могли бы сделать:

var items = new List<NameAndOrder>(strs.Count); 

for (var i = 0; i < strs.Count; i++) 
{ 
    items.Add(new NameAndOrder { Name = strs[i], Order = values[i] }); 
} 

items.Sort((a, b) => a.Order.CompareTo(b.Order)); 
2

Как вы создаете эти коллекции? Или вам даны эти два параметра?

Вы можете создать StringAndOrder класс и использовать LINQ:

public class StringAndOrder 
{ 
    public string String { get; set; } 
    public double Order { get; set; } 
} 

List<StringAndOrder> list; //create with this structure instead 
var orderedStrings = list.OrderBy(item => item.Order).Select(item => item.String); 
1

Почему вы не использовать словарь объектов ..

Dictionary<string, int> dictionary = 
    new Dictionary<string, int>(); 
dictionary.Add("cat", 2); 
dictionary.Add("dog", 1); 
dictionary.Add("llama", 0); 
dictionary.Add("iguana", -1); 
// Acquire keys and sort them. 
var list = dictionary.Keys.ToList(); 
list.Sort(); 
1
var strs = new[] { "abc", "def", "ghi" }; 
var values = new[] { 3, 1, 2 }; 

var newArr = strs.Select((s, i) => new { s, i }) 
       .OrderBy(x => values[x.i]) 
       .Select(x => x.s) 
       .ToArray(); 
Смежные вопросы