由于我从系统获取数据的限制,我最终在订单列表中使用了重复的词典。系统会查看商品数量,并为订单中的每个商品提供一个订单。基本上我最终得到了这个:
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值,以便最终得到列表中的不同字典。有人可以帮忙吗?
答案 0 :(得分: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));
答案 1 :(得分:2)
我建议先选择不同的ID:
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();