2013-11-01 5 views
1

Я пытаюсь сортировать мой класс здесь. Мой код следуетКак отсортировать этот словарь

public class Row 
{ 
    private Dictionary<string, object> _data = new Dictionary<string, object>(); 
    public object this[string index] 
    { 
     get { return _data[index]; } 
     set { _data[index] = value; } 
    } 
} 

я добавил его в коллекцию, как наблюдаемых

ObservableCollection<Row> RowList = new ObservableCollection<Row>(); 

В моем Окончательный вывод я получаю

RowList[0]._data[0].Key = "Column 1" 
        .Value = "23" 
      ._data[1].Key = "Column 2" 
        .Value = "Not Important" 
      ._data[1].Key = "Column 3" 
        .Value = "Not Important" 

RowList[1]._data[0].Key = "Column 1" 
         .Value = "11" 
      ._data[1].Key = "Column 2" 
         .Value = "Not Important" 
      ._data[1].Key = "Column 3" 
         .Value="Not Important" 

RowList[2]._data[0].Key = "Column 1" 
        .Value = "8" 
      ._data[1].Key = "Column 2" 
        .Value = "Not Important" 
      ._data[1].Key = "Column 3" 
        .Value = "Not Important" 

Теперь я хочу Сортировать Column 1 значения. Я могу использовать Linq, я попытался использовать

foreach (RowList _r in RowList.OrderBy(p => p.Column1))// I am not sure if this approach is right 
{ 

} 
+2

Да, это нормально. У вас есть какие-то конкретные проблемы? Обратите внимание, что это вовсе не изменение словаря - это просто создание новой последовательности, которая имеет одни и те же элементы, но в другом порядке. –

+0

Я просто хочу отсортировать элементы, а затем, возможно, добавить в другую наблюдаемую коллекцию. –

+0

На самом деле, глядя на нее, этот код даже не компилируется на данный момент. У вашего типа 'Row' нет свойства' Column1'. Обратите внимание, что вы не пытаетесь сортировать словарь - вы пытаетесь отсортировать * подборку словарей. –

ответ

0

Вы можете сортировать его по любому выражению. Он не должен быть простой доступ к свойствам (которые вы предполагаете, что интуитивно):

RowList.OrderBy(p => (AppropriateDataTypeHere)p.Keys["Column1"]) 

Бросок необходим, потому что вы не можете сравнить два object переменными. Вы можете написать обычай IComparer<object>, который может это сделать, и который будет реализовывать ваши правила сравнения.

0

Вы и другие ответчики очень близки к решению. Это на самом деле:

RowList.OrderBy(p => p["Column1"]) 

класс имеет свойство индексатор, который принимает строку (не целое).

Вы также должны учитывать подсказку @ usr о типах значений. В вашем примере все значения являются строками. Это означает, что они сортируются как строки: 11, 23, 8

Чтобы заказать их численно можно либо изменить тип значения:

row[0]["Column1"] = 23; // <-- value is int 
row[1]["Column1"] = 11; 
row[2]["Column1"] = 8; 

или преобразовать их в порядок:

RowList.OrderBy(p => int.Parse(p["Column1"])); 

Теперь заказ: 8, 11, 23

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