为什么C#中的SortedList没有Find方法?

时间:2010-08-29 16:51:43

标签: c# .net linq data-structures sortedlist

如果你问我,傻傻的。但是这条消息就在这里,因为我会假设(可能是正确的)我是愚蠢的,而不是微软。那么......有什么我想念的吗?为什么他们没有为这个孩子提供“查找”方法? find可以在值上运行,它们是对象,所以我可以这样做:

someObject = SortedList.Values.Find(order => order.OrderID == orderID);

3 个答案:

答案 0 :(得分:5)

您可能在LINQ中寻找.First(...).Single(...)(或其OrDefault变体),但这只适用于实现IEnumerable<T>的类型。 SortedList不是强类型的,因此Lambda不起作用。看看LINQ的.Cast<T>()

答案 1 :(得分:5)

你可能想要:

SortedList.Values.Cast<Order>().FirstOrDefault(order => order.OrderID == orderID);

当然,如果您在谈论SortedList<TKey, TValue>,则无需拨打Cast()

顺便说一句,如果你以这种方式探索Values的{​​{1}},你很可能会使用错误的选择/使用错误的数据结构

修改

如果您不能在项目中使用LINQ,也不希望分别维护由订单的日期和订单ID键入的单独数据结构(如Ben Voigt所建议的那样),我认为别无选择,只能自己实施搜索:

SortedList

如果您想进一步概括,请编写自己的foreach(ShopOrder order in sortedList.Values) { if(order.OrderID == orderID) return order; } return null; // or throw an exception, whichever you find appropriate. 实施。

答案 2 :(得分:1)

您是否在列表排序的同一字段上搜索?二进制搜索速度最快,SortedList提供IndexOfKey函数来执行此操作。

看起来你正在搜索这些值,在这种情况下,GetValueList的结果使用LINQ的FirstOrDefault应该有效。

另请参阅:http://social.msdn.microsoft.com/Forums/en-US/csharplanguage/thread/55241049-7e7e-4006-8e04-70779698d609