Как получить отличные значения из List <Dictionay <string, string >> в c #

1

Из-за ограничений на систему, с которой я получаю данные, в итоге я получаю дубликаты словарей в списке заказов. Система просматривает количество элементов и дает мне один заказ для каждого элемента внутри заказа. В основном я в итоге:

            List<Dictionary<string, string>> myOrders = new List<Dictionary<string, string>>();

            Dictionary<string, string> dictionay = new Dictionary<string,string>();
            dictionay.Add("OrderId", "00000082");
            dictionay.Add("Order Status", "In Process");
            myOrders.Add(dictionay);
            Dictionary<string, string> dictionay1 = new Dictionary<string, string>();
            dictionay1.Add("OrderId", "00000082");
            dictionay1.Add("Order Status", "In Process");
            myOrders.Add(dictionay1);
            Dictionary<string, string> dictionay2 = new Dictionary<string, string>();
            dictionay2.Add("OrderId", "00000083");
            dictionay2.Add("Order Status", "In Process");
            myOrders.Add(dictionay2);
            Dictionary<string, string> dictionay3 = new Dictionary<string, string>();
            dictionay3.Add("OrderId", "00000084");
            dictionay3.Add("Order Status", "In Process");
            myOrders.Add(dictionay3);

Я уверен, что есть простой способ сделать это, но мне сложно провести цикл через myOrders и сравнить значение OrderId, чтобы в итоге получить различные словари в списке. Может ли кто-нибудь помочь?

  • 1
    Что вы хотите в качестве выхода, точно? Не совсем понятно, что вы хотите получить после фильтрации этих данных ...
  • 0
    Вы правы, я не указал, что мне нужно в качестве вывода. Основываясь на примере, мне нужен список, который имеет только одну запись для OrderId 00000082.
Показать ещё 1 комментарий
Теги:

2 ответа

2
Лучший ответ

Я бы предложил сначала выбрать отдельные идентификаторы:

IEnumerable<string> ids = myOrders.Select(order => order["OrderId"]).Distinct();

Затем выберите первый словарь, соответствующий каждому id:

List<Dictionary<string, string>> distinctOrders = 
    ids.Select(id => 
        myOrders.First(order => order["OrderId"] == id)).ToList();

Я также предлагаю вам не использовать словари для этой цели и вместо этого создавать класс Order с OrderId и OrderStatus качестве свойств этого класса.

В качестве альтернативы, если вы не возражаете добавить стороннюю зависимость, вы можете подумать о morelinq, у которого есть метод DistinctBy подходящий для этого. Если вы используете это, вы просто выполните:

List<Dictionary<string, string>> distinctOrders = 
    myOrders.DistinctBy(order => order["OrderId"]).ToList();
  • 0
    +1 за создание класса Order .
3

Во-первых - если каждый элемент списка является отдельной записью, вам может потребоваться переключиться на List<Tuple<string,string>> или List<KeyValuePair<string,string>>.

При этом вы можете получить уникальный список значений OrderId через что-то вроде:

var uniqueIds = new HashSet<string>(
                     myOrders
                     .SelectMany(o => o) // Extract all KeyValuePairs
                     .Where(kvp => kvp.Key == "OrderId")
                     .Select(kvp => kvp.Value));
  • 0
    Как это будет работать? Он выберет все статусы заказа, а также идентификаторы.
  • 0
    @BenAaronson Да - понял, что после публикации - и исправил.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню