Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用LINQ将多个字典中的值选择到对象列表中_C#_Linq_Dictionary - Fatal编程技术网

C# 使用LINQ将多个字典中的值选择到对象列表中

C# 使用LINQ将多个字典中的值选择到对象列表中,c#,linq,dictionary,C#,Linq,Dictionary,我想从多个字典中选择OrderId&Row,并创建一个包含行列表的订单列表 到目前为止,我正在努力解决的代码是: var listOfDictionaries = new List<Dictionary<string, string>>(); var dict1 = new Dictionary<string, string>(); dict1.Add("OrderId", "12345"); dict1.Add("Row", "1");

我想从多个字典中选择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; }
}
var listOfDictionaries=new List();
var dict1=新字典();
添加(“订单ID”、“12345”);
第1条添加(“第1行”);
字典列表。添加(dict1);
var dict2=新字典();
添加(“订单ID”、“97845”);
第2条添加(“第10行”);
字典列表。添加(dict2);
var dict3=新字典();
添加(“订单ID”、“12345”);
第3条添加(“第2行”);
字典目录.增补(第3条);
var group=ListofDictionary.SelectMany(d=>
d、 其中(kvp=>
kvp.Key.ToLower().Contains(“orderid”)| | kvp.Key.ToLower().Contains(“行”))
.GroupBy(a=>a.Key).ToList();
公共阶级秩序
{
公共秩序()
{
OrderRows=新列表();
}
公共字符串OrderId{get;set;}
公共列表OrderRows{get;set;}
}
公共类OrderRow
{
公共字符串OrderRowId{get;set;}
}

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

您可以先选择订单,然后像这样选择记录行

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()
});

您可以先选择订单,然后像这样选择记录行

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()
});
你需要做什么

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) });
你需要做什么

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) });

正如@Nikhil Agrawal所说:

检查


正如@Nikhil Agrawal所说:

检查


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

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();
    }
}
类堆栈溢出
{
结构OrderData
{
公共字符串OrderID{get;set;}
公共字符串行{get;set;}
}
静态void Main(字符串[]参数)
{
字符串strInputOrderID=“ORD1”;
////使用结构列表
List objOrderDataList=新列表();
OrderData objOrderData=新OrderData();
objOrderData.OrderID=“ORD1”;
objOrderData.Row=“1”;
添加(objOrderData);
objOrderData=neworderdata();
objOrderData.OrderID=“ORD2”;
objOrderData.Row=“2”;
添加(objOrderData);
objOrderData=neworderdata();
objOrderData.OrderID=“ORD3”;
objOrderData.Row=“3”;
添加(objOrderData);
objOrderData=neworderdata();
objOrderData.OrderID=“ORD1”;
objOrderData.Row=“4”;
添加(objOrderData);
List resultOrderDataList=(来自objOrderDataList中的数据
其中data.OrderID.Equals(strInputOrderID)
选择数据);
Console.ReadLine();
}
}
我已经运行了它,它工作得很好。
请检查并在评论中告诉我。

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

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();
    }
}
类堆栈溢出
{
结构OrderData
{
公共字符串OrderID{get;set;}
公共字符串行{get;set;}
}
静态void Main(字符串[]参数)
{
字符串strInputOrderID=“ORD1”;
////使用结构列表
List objOrderDataList=新列表();
OrderData objOrderData=新OrderData();
objOrderData.OrderID=“ORD1”;
objOrderData.Row=“1”;
添加(objOrderData);
objOrderData=neworderdata();
objOrderData.OrderID=“ORD2”;
objOrderData.Row=“2”;
添加(objOrderData);
objOrderData=neworderdata();
objOrderData.OrderID=“ORD3”;
objOrderData.Row=“3”;
添加(objOrderData);
objOrderData=neworderdata();
objOrderData.OrderID=“ORD1”;
objOrderData.Row=“4”;
添加(objOrderData);
List resultOrderDataList=(来自objOrderDataList中的数据
其中data.OrderID.Equals(strInputOrderID)
选择数据);
Console.ReadLine();
}
}
我已经运行了它,它工作得很好。
请检查并在评论中告知我。

SelectMany会让他们变得平淡无奇。希望dict3后面的代码在dict3中增加值,而不是在dict2中增加值。SelectMany会让他们平淡无奇。希望dict3后面的代码在dict3中增加值,而不是在dict2中增加值。谢谢您的回答。我得到以下异常:System.ArgumentException:已添加具有相同密钥的项。在System.Collections.Generic.Dictionary`2.Insert(TKey key,TValue,Boolean add)在Rextester.Program.Main(String[]args)@Henrik查看第三个字典的代码。将其中的条目添加到第二个<代码>指令2.添加(“行”,“2”)谢谢你的回答。我得到以下异常:System.ArgumentException:已添加具有相同密钥的项。在System.Collections.Generic.Dictionary`2.Insert(TKey key,TValue,Boolean add)在Rextester.Program.Main(String[]args)@Henrik查看第三个字典的代码。将其中的条目添加到第二个<代码>指令2.添加(“行”,“2”)