如何从List <dictionary <string,string =“”>&gt;获取不同的值在c#</dictionary <string,>

时间:2014-06-12 16:36:36

标签: c#

由于我从系统获取数据的限制,我最终在订单列表中使用了重复的词典。系统会查看商品数量,并为订单中的每个商品提供一个订单。基本上我最终得到了这个:

            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值,以便最终得到列表中的不同字典。有人可以帮忙吗?

2 个答案:

答案 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类,其中OrderIdOrderStatus作为该类的属性。

或者,如果您不介意添加第三方依赖项,则可以考虑morelinq,其中DistinctBy方法适用于此。如果您使用它,您只需:

List<Dictionary<string, string>> distinctOrders = 
    myOrders.DistinctBy(order => order["OrderId"]).ToList();