Как отсортировать список объектов по значению словаря? - PullRequest
3 голосов
/ 17 марта 2011

Как бы я отсортировал это по выбранному значению словаря в Персоне?

Пример: список заказов "Person" по значению "cars" по убыванию.

Возможно ли это с помощью одного из этих причудливых уравнений лямбда / линк?

public class People 
{
    List<Person> Persons { get; set; }
}

public class Person
{
    public Dictionary<string, string> cars { get; set; } 
    public Dictionary<string, string> houses { get; set; } 
    public Dictionary<string, string> banks { get; set; }
}

................

People people = new People();

people.Persons = new List<Person> 
{
    new Person 
    {
        cars = new Dictionary<string, string> { { "volvo", "340050" }, { "bmw", "50545000" } }, 
        houses = new Dictionary<string, string> { { "mansion", "100040000" },{ "cardboard box", "112" } },
        banks = new Dictionary<string, string> { { "swiss", "12500330000" }, { "camen", "12000000" } }
    }, 
    new Person 
    {
        cars = new Dictionary<string, string> { { "volvo", "34023200" }, { "bmw", "5003300" } }, 
        houses = new Dictionary<string, string> { { "mansion", "1000330000" },{ "cardboard box", "277" } },
        banks = new Dictionary<string, string> { { "swiss", "12500044000" }, { "camen", "12000000" } }
    }, 
    new Person 
    {
        cars = new Dictionary<string, string> { { "volvo", "3554000" }, { "bmw", "50023200" } }, 
        houses = new Dictionary<string, string> { { "mansion", "1006600000" },{ "cardboard box", "244" } },
        banks = new Dictionary<string, string> { { "swiss", "125000544000" }, { "camen", "12000777000" } }
    }
};

РЕДАКТИРОВАТЬ / ПРИМЕР РЕЗУЛЬТАТ:

Результатом будет новый или переупорядоченный список, основанный на значении, содержащемся в словаре каждого человека

Человек -> автомобили -> {"volvo", "34023200"}
Человек -> автомобили -> {"volvo", "3554000"}
Человек -> автомобили -> {"volvo", "340050"}

Новый или переупорядоченный список будет выглядеть именно так:

people.Persons = new List<Person> 
{
    new Person 
    {
        cars = new Dictionary<string, string> { { "volvo", "34023200" }, { "bmw", "5003300" } }, 
        houses = new Dictionary<string, string> { { "mansion", "1000330000" },{ "cardboard box", "277" } },
        banks = new Dictionary<string, string> { { "swiss", "12500044000" }, { "camen", "12000000" } }
    },
    new Person 
    {
        cars = new Dictionary<string, string> { { "volvo", "3554000" }, { "bmw", "50023200" } }, 
        houses = new Dictionary<string, string> { { "mansion", "1006600000" },{ "cardboard box", "244" } },
        banks = new Dictionary<string, string> { { "swiss", "125000544000" }, { "camen", "12000777000" } }
    },
    new Person 
    {
        cars = new Dictionary<string, string> { { "volvo", "340050" }, { "bmw", "50545000" } }, 
        houses = new Dictionary<string, string> { { "mansion", "100040000" },{ "cardboard box", "112" } },
        banks = new Dictionary<string, string> { { "swiss", "12500330000" }, { "camen", "12000000" } }
    }
};

Ответы [ 2 ]

4 голосов
/ 17 марта 2011

Вот хитрый трюк;По сути, словарь можно рассматривать как список объектов KeyValuePair <>.

Dictionary<int, string> myDictionary = new Dictionary<int, string>();
foreach(var item in myDictionary)
// item is a KeyValuePair<int, string>, enumerated in order of their insertion into the dictionary

Теперь, когда он находится в списке, его легко сортировать с помощью LINQ:

Dictionary<int, string> sample = new Dictionary<int, string>
{
   { 1, "Sample" },
   { 2, "Another Sample" }
};

var orderedList = sample.OrderBy(x => x.Value).ToList();

Конечно, большая проблема заключается в том, почему вам нужно отсортировать и упорядочить словарь - это не совсем операция, которая действительно сгруппирована с понятием словаря (это скорее для быстрого доступа к определенным элементам через указанный ключ).Описание проблемы, о которой вы пишете, кажется странным;Вы можете заказать автомобили для конкретного человека, но пытаетесь ли вы найти каждый автомобиль у каждого человека, упорядоченного по стоимости?

Это также легко сделать:

List<PersonCarDetails> allStuff = new List<PersonCarDetails>();

foreach(var person in persons)
   allStuff.AddRange(person.Cars.Select(x => new PersonCarDetails { PersonId = person.Id, CarName = x.Key, CarId = x.Value }).ToList());

 // allStuff now contains a list of PersonCarDetails, and then you can order that:

 var orderedList = allStuff.OrderBy(x => x.CarId).ToList();
0 голосов
/ 17 марта 2011

Если вы имеете в виду сортировку по количеству автомобилей, принадлежащих данному лицу

var result = Person.OrderByDescending(x => x.cars.Count);

Если вы имеете в виду сортировку по первому (отсортированному по имени) названию автомобиля, принадлежащего этому лицу

var result = Person.OrderByDescending(x => x.cars.Keys.OrderBy(y => y.Key).FirstOrDefault());

Если вы имеете в виду сортировку по первому (отсортированному по номеру) номеру машины, принадлежащему этому человеку

var result = Person.OrderByDescending(x => x.cars.Keys.OrderBy(y => y.value).FirstOrDefault());

В качестве примера вывода было бы полезно уточнить, что именно вы хотите отсортировать, поскольку автомобили - это список., а не просто элемент.


Исходя из предоставленных вами примеров, это может помочь вам:

var result = Person.OrderByDescending(x => x.cars.Values.FirstOrDefault());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...