【问题标题】:Select values from multiple dictionaries into list of objects with LINQ使用 LINQ 从多个字典中选择值到对象列表中
【发布时间】:2017-07-06 07:39:32
【问题描述】:

我想从多个字典中选择 OrderId & Row 并创建一个包含行列表的订单列表。

到目前为止,我正在努力解决的代码是:

var listOfDictionaries = new List<Dictionary<string, string>>();

var dict1 = new Dictionary<string, string>();
dict1.Add("OrderId", "12345");      
dict1.Add("Row", "1");              
listOfDictionaries.Add(dict1);

var dict2 = new Dictionary<string, string>();
dict2.Add("OrderId", "97845");
dict2.Add("Row", "10");
listOfDictionaries.Add(dict2);

var dict3 = new Dictionary<string, string>();
dict3.Add("OrderId", "12345");
dict3.Add("Row", "2");
listOfDictionaries.Add(dict3);

var grouped = listOfDictionaries.SelectMany(d => 
                 d.Where(kvp => 
                    kvp.Key.ToLower().Contains("orderid") || kvp.Key.ToLower().Contains("row")))
              .GroupBy(a => a.Key).ToList();

public class Order 
{
    public Order() 
    {
       OrderRows = new List<OrderRow>();
    }

    public string OrderId { get; set; }
    public List<OrderRow> OrderRows { get; set; }
}

public class OrderRow 
{
    public string OrderRowId { get; set; }
}

有人知道如何解决这个问题吗?

【问题讨论】:

  • SelectMany 会使它们变平,所以这是个坏主意。
  • 希望dict3之后的代码在dict3中而不是在dict2中增值。

标签: c# linq dictionary


【解决方案1】:

您可以先选择订单,然后再选择相关行。

var orderFieldName = "OrderId";
var orders = listOfDictionaries.Select(dict => dict[orderFieldName]).Distinct();
var grouped = orders.Select(order => new Order
{
    OrderId = order,
    OrderRows = listOfDictionaries.Where(dict => dict[orderFieldName] == order)
        .Select(item => new OrderRow {OrderRowId = item["Row"]}).ToList()
});

【讨论】:

  • 感谢您的回答。我收到以下异常: System.ArgumentException:已添加具有相同键的项目。在 System.ThrowHelper.ThrowArgumentException(ExceptionResource 资源) 在 System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add) 在 Rextester.Program.Main(String[] args)
  • @Henrik 看第三本词典的代码。您将那里的条目添加到第二个。 dict2.Add("Row", "2");
【解决方案2】:

你需要做的

var result = listOfDictionaries.Select(x => new { OrderId = x["OrderId"], Row = x["Row"] })
                   .GroupBy(x => x.OrderId)
                   .Select(x => new { OrderId = x.Key, Values = x.Select(y => y.Row) });

【讨论】:

    【解决方案3】:

    我觉得你的字典代码不会运行,因为它不允许你在同一个列表中输入重复的键值。所以在这里我使用结构列表创建了一个解决方案

    class Stackoverflow
    {
        struct OrderData
        {
            public string OrderID { get; set; }
            public string Row { get; set; }
        }
        static void Main(string[] args)
        {
            string strInputOrderID = "ORD1";
    
            ////Using Struct List
            List<OrderData> objOrderDataList = new List<OrderData>();
    
            OrderData objOrderData = new OrderData();
            objOrderData.OrderID = "ORD1";
            objOrderData.Row = "1";
            objOrderDataList.Add(objOrderData);
    
            objOrderData = new OrderData();
            objOrderData.OrderID = "ORD2";
            objOrderData.Row = "2";
            objOrderDataList.Add(objOrderData);
    
            objOrderData = new OrderData();
            objOrderData.OrderID = "ORD3";
            objOrderData.Row = "3";
            objOrderDataList.Add(objOrderData);
    
            objOrderData = new OrderData();
            objOrderData.OrderID = "ORD1";
            objOrderData.Row = "4";
            objOrderDataList.Add(objOrderData);
    
            List<OrderData> resultOrderDataList = (from data in objOrderDataList
                                                   where data.OrderID.Equals(strInputOrderID)
                                                   select data).ToList();
            Console.ReadLine();
        }
    }
    

    我已经运行它并且它工作正常。 请检查并在评论中告诉我。

    【讨论】:

      【解决方案4】:

      就像@Nikhil Agrawal 说的:

      查看this

      var result = listOfDictionaries
                  .Select(x => new { OrderId = x["OrderId"], Row = x["Row"] })
                  .GroupBy(x => x.OrderId)
                  .Select(x => new Order{
                      OrderId = x.Key, 
                      OrderRows = x.Select(y => new OrderRow{OrderRowId = y.Row}).ToList()
                  });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-25
        • 2010-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多