C# 使用LINQ将多个字典中的值选择到对象列表中
我想从多个字典中选择OrderId&Row,并创建一个包含行列表的订单列表 到目前为止,我正在努力解决的代码是: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");
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”)代码>