3 回答

TA貢獻(xiàn)1934條經(jīng)驗(yàn) 獲得超2個贊
從.net3.5 +開始,Dictionary<IKey, List<IValue>>可以使用LookupLinq命名空間中的a 來代替使用a :
// lookup Order by payment status (1:m)
// would need something like Dictionary<Boolean, IEnumerable<Order>> orderIdByIsPayed
ILookup<Boolean, Order> byPayment = orderList.ToLookup(o => o.IsPayed);
IEnumerable<Order> payedOrders = byPayment[false];
來自msdn:
查找類似于字典。區(qū)別在于字典將鍵映射到單個值,而查閱將鍵映射到值的集合。
您可以通過在實(shí)現(xiàn)IEnumerable的對象上調(diào)用ToLookup來創(chuàng)建Lookup的實(shí)例。
您可能還需要閱讀這個答案的相關(guān)問題。有關(guān)更多信息,請咨詢msdn。
完整示例:
using System;
using System.Collections.Generic;
using System.Linq;
namespace LinqLookupSpike
{
class Program
{
static void Main(String[] args)
{
// init
var orderList = new List<Order>();
orderList.Add(new Order(1, 1, 2010, true));//(orderId, customerId, year, isPayed)
orderList.Add(new Order(2, 2, 2010, true));
orderList.Add(new Order(3, 1, 2010, true));
orderList.Add(new Order(4, 2, 2011, true));
orderList.Add(new Order(5, 2, 2011, false));
orderList.Add(new Order(6, 1, 2011, true));
orderList.Add(new Order(7, 3, 2012, false));
// lookup Order by its id (1:1, so usual dictionary is ok)
Dictionary<Int32, Order> orders = orderList.ToDictionary(o => o.OrderId, o => o);
// lookup Order by customer (1:n)
// would need something like Dictionary<Int32, IEnumerable<Order>> orderIdByCustomer
ILookup<Int32, Order> byCustomerId = orderList.ToLookup(o => o.CustomerId);
foreach (var customerOrders in byCustomerId)
{
Console.WriteLine("Customer {0} ordered:", customerOrders.Key);
foreach (var order in customerOrders)
{
Console.WriteLine(" Order {0} is payed: {1}", order.OrderId, order.IsPayed);
}
}
// the same using old fashioned Dictionary
Dictionary<Int32, List<Order>> orderIdByCustomer;
orderIdByCustomer = byCustomerId.ToDictionary(g => g.Key, g => g.ToList());
foreach (var customerOrders in orderIdByCustomer)
{
Console.WriteLine("Customer {0} ordered:", customerOrders.Key);
foreach (var order in customerOrders.Value)
{
Console.WriteLine(" Order {0} is payed: {1}", order.OrderId, order.IsPayed);
}
}
// lookup Order by payment status (1:m)
// would need something like Dictionary<Boolean, IEnumerable<Order>> orderIdByIsPayed
ILookup<Boolean, Order> byPayment = orderList.ToLookup(o => o.IsPayed);
IEnumerable<Order> payedOrders = byPayment[false];
foreach (var payedOrder in payedOrders)
{
Console.WriteLine("Order {0} from Customer {1} is not payed.", payedOrder.OrderId, payedOrder.CustomerId);
}
}
class Order
{
// key properties
public Int32 OrderId { get; private set; }
public Int32 CustomerId { get; private set; }
public Int32 Year { get; private set; }
public Boolean IsPayed { get; private set; }
// additional properties
// private List<OrderItem> _items;
public Order(Int32 orderId, Int32 customerId, Int32 year, Boolean isPayed)
{
OrderId = orderId;
CustomerId = customerId;
Year = year;
IsPayed = isPayed;
}
}
}
}
關(guān)于不變性的評論
默認(rèn)情況下,查找是不可變的,訪問internals將涉及反射。如果您需要可變性并且不想編寫自己的包裝器,則可以使用corefxlab中的(以前MultiValueDictionary稱為MultiDictionary)(以前不再更新其中的一部分)。Microsoft.Experimental.Collections

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超13個贊
字典的值類型可以是List或包含多個對象的其他類。就像是
Dictionary<int, List<string>>
用于由int鍵控并包含字符串列表的Dictionary。
選擇值類型的主要考慮因素是將使用Dictionary的目的,如果您必須對值進(jìn)行搜索或其他操作,那么也許考慮考慮使用一種可以幫助您完成所需工作的數(shù)據(jù)結(jié)構(gòu)- -像HashSet。
- 3 回答
- 0 關(guān)注
- 1502 瀏覽
添加回答
舉報(bào)