Из-за ограничений на систему, с которой я получаю данные, в итоге я получаю дубликаты словарей в списке заказов. Система просматривает количество элементов и дает мне один заказ для каждого элемента внутри заказа. В основном я в итоге:
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, чтобы в итоге получить различные словари в списке. Может ли кто-нибудь помочь?
Я бы предложил сначала выбрать отдельные идентификаторы:
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();
Order
.
Во-первых - если каждый элемент списка является отдельной записью, вам может потребоваться переключиться на 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));