【问题标题】:Why does SortedList in C# have no Find method?为什么C#中的SortedList没有Find方法?
【发布时间】:2010-08-29 16:51:42
【问题描述】:

如果你问我就傻了。但是这个消息在这里是因为我会假设(可能是正确的)我是愚蠢的人,而不是微软。所以......我有什么遗漏吗?为什么他们没有为这个婴儿添加“查找”方法?查找可以对作为对象的值起作用,所以我可以这样做:

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

【问题讨论】:

  • 排序列表旨在支持使用键进行高效查找。如果您需要使用其他条件搜索列表,那么使用OrderID 作为列表中的键可能是个好主意,也许(除非您很少需要这个...)?
  • 我得到了按日期时间排序的列表。这就是我使用 SortedList 的原因。

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


【解决方案1】:

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

【讨论】:

  • 我在这个项目中没有使用 LINQ。 IndexOfKey 没有用。我正在寻找具有特定 ID 的特定对象。
【解决方案2】:

你可能想要:

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

当然,如果您正在谈论SortedList&lt;TKey, TValue&gt;,则无需调用Cast()

顺便说一句,如果您以这种方式浏览 ValuesSortedList,则很有可能您选择了错误的键/完全使用了错误的数据结构。

编辑:

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

foreach(ShopOrder order in sortedList.Values)
{
  if(order.OrderID == orderID) return order;
}

return null; // or throw an exception, whichever you find appropriate.

如果您想进一步概括,请编写您自己的 FirstOrDefault 实现。

【讨论】:

  • 我的声明是 SortedList orders = new SortedList(comparer);比较器是一个简单的 DateTime 比较器。我有更多订单,我需要按 DateTime 对它们进行排序,但我也想快速找到订单 ID。我认为这是使用正确的结构。而且我不使用 LINQ 顺便说一句,所以我看不到 "FirstOrDefault" ::- (.
  • @ Axonn - 至少在时间复杂性的意义上,您不能“快速”找到具有此数据结构的 orderID。顺便说一句,你有什么理由不能使用 LINQ?您使用的是 .NET 3.5 之前的版本吗?
  • 那么您可能需要两个集合:SortedList&lt;DateTime, ShopOrder&gt;Dictionary&lt;int, ShopOrder&gt;,可让您根据 ID 轻松查找。
  • @Axonn:即使你不能使用“真正的”LINQ,你也可以自己随便写一个.First().FirstOrDefault()方法:csharp.pastebin.com/zuPB2kbn
  • 最终我编写了一个对普通列表进行排序的方法,仅此而已::- D。感谢所有 cmets。
【解决方案3】:

您是否在列表排序依据的同一字段上进行搜索?二分查找是最快的,SortedList 提供了IndexOfKey 函数来做到这一点。

看起来您正在搜索这些值,在这种情况下,在 GetValueList 的结果上使用 LINQ 的 FirstOrDefault 应该可以工作。

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

【讨论】:

  • 我在这个项目中没有使用 LINQ。 IndexOfKey 没有用。我正在寻找具有特定 ID 的特定对象。
猜你喜欢
  • 1970-01-01
  • 2012-02-02
  • 2012-07-21
  • 2011-04-09
  • 1970-01-01
  • 1970-01-01
  • 2017-06-13
相关资源
最近更新 更多