你如何排序KeyedCollection <tkey,titem =“”>?</tkey,>

时间:2011-01-12 00:26:07

标签: c# generics sorting collections keyedcollection

基本上我有一个KeyedCollection<string, CustomNode>,我希望能够通过密钥(或者最好使用自定义比较器)对集合进行排序。

如果无法做到这一点,有人可以推荐另一个类,其中键可以嵌入到我可以排序的值中吗?

6 个答案:

答案 0 :(得分:3)

在尝试解决类似问题时遇到了这个问题。如果仍然相关,我可以使用此处的示例实现Sort:

http://social.msdn.microsoft.com/forums/en-US/netfxbcl/thread/56adc0f9-aa1b-4acf-8546-082bb01058f2/

基本上涉及对集合的基础List进行排序。对我来说就像一个魅力。

干杯!

答案 1 :(得分:2)

KeyCollection<T>继承自实现Collection<T>的{​​{1}},因此您应该可以使用IEnumerableIEnumerable.OrderBy()也有allows you to supply a custom comparer的重载。

答案 2 :(得分:2)

根据进一步的信息(参见上面对answer的评论),要求是在编辑属性后保持“set”按元素的属性排序。

在这种情况下,您可以查看BindableLinq(还有其他类似的框架)并使用在那里实现的OrderBy语句。

KeyedCollection<string, CustomNode> collection = /* from whereever */
collection.Items.AsBindable().OrderBy(c => c.PropertyOnCustomNode);

只要您编辑的属性引发了PropertyChanged事件,它就会立即应用重新排序。如果您希望更改集合,请确保源集合实现INotifyCollectionChanged。

答案 3 :(得分:1)

这是基于Dan在答案中提供的链接: http://social.msdn.microsoft.com/forums/en-US/netfxbcl/thread/56adc0f9-aa1b-4acf-8546-082bb01058f2/

   public class RequestTemplate : IComparable<RequestTemplate>
   {
      // This is the primary key for the object
      private Guid _guidNumber;

      // This is what a collection of these objects should be sorted by
      private string _buttonCaption = "";


      public Guid GuidNumber
      {
         get { return _guidNumber; }
         set { _guidNumber = value; }  // Setter only provided for deserialization usage
      }

      public string ButtonCaption
      {
         get { return _buttonCaption; }
         set { _buttonCaption = value; }
      }


      /// <summary>
      /// Method needed to allow sorting a collection of these objects.
      /// </summary>
      public int CompareTo(RequestTemplate other)
      {
         return string.Compare(this.ButtonCaption, other.ButtonCaption, 
                               StringComparison.CurrentCultureIgnoreCase);
      }
   }


   public class RequestTemplateKeyedCollection : KeyedCollection<Guid, RequestTemplate>
   {
      /// <summary>
      /// Sort the collection by sorting the underlying collection, accessed by casting the Items 
      /// property from IList to List.
      /// </summary>
      public void Sort()
      {
         List<RequestTemplate> castList = base.Items as List<RequestTemplate>;
         if (castList != null)
            castList.Sort();  // Uses default Sort() for collection items (RequestTemplate)
      }


      /// <summary>
      /// Method needed by KeyedCollection.
      /// </summary>
      protected override Guid GetKeyForItem(RequestTemplate requestTemplate)
      {
         return requestTemplate.GuidNumber;
      }
   }

尚未广泛测试,但它似乎工作正常。

答案 4 :(得分:-1)

为什么不使用SortedList<TKey, TValue>类?

MSDN link

答案 5 :(得分:-1)

你可能会看一下SortedDictionary集合......但是这会增加项目检索O(log N)的费用,而不是带有O(1)检索的KeyedCollection。