【问题标题】:C# - sorting by a propertyC# - 按属性排序
【发布时间】:2012-12-18 07:08:46
【问题描述】:

我正在尝试通过自定义属性对 C# 中的对象集合进行排序。 (对于上下文,我正在使用 Twitterizer 库处理 Twitter API,将直接消息分类到对话视图中)

假设一个自定义类有一个名为label 的属性,其中label 是在类构造函数时分配的string。

我有一个上述类的Collection(或List,没关系),我想根据值将它们全部分类为单独的Lists(或Collections) label,并将它们组合在一起。

目前,我一直在通过使用foreach 循环并以这种方式检查值来执行此操作 - 我知道这是对 CPU 时间的可怕浪费和糟糕的编程。我很惭愧。

基本上我知道我拥有的所有数据都是给我的,我也知道它应该很容易排序。人类用几张纸就可以很容易地做到这一点,但我只是不知道如何在 C# 中做到这一点。

有没有人可以解决这个问题?如果您需要更多信息和/或上下文,请询问。

【问题讨论】:

  • a horrible waste of CPU time and awful programming? 你在说什么?如果您有一个集合,这就是您对它进行排序的方式 - 您迭代这些项目。没有真正的解决办法。

标签: c# list sorting collections


【解决方案1】:

你试过Linq的OrderBy吗?

var mySortedList = myCollection.OrderBy(x => x.PropertyName).ToList();

这仍然会循环遍历要排序的值 - 没有办法解决这个问题。这至少会清理你的代码。

【讨论】:

    【解决方案2】:

    你说的是排序,但听起来你是在尝试根据一个共同的价值划分一个事物列表。为此你想要GroupBy。

    您还希望ToDictionary 从IGrouping 切换,因为您可能需要基于键的查找。

    我假设每个输出集中的元素都需要排序,因此请查看OrderBy。由于您无疑会多次访问每个列表,因此您希望将其折叠为列表或数组(您提到列表),所以我使用了ToList

    //Make some test data
    var labels = new[] {"A", "B", "C", "D"};
    var rawMessages = new List<Message>();
    
    for (var i = 0; i < 15; ++i)
    {
        rawMessages.Add(new Message
        {
            Label = labels[i % labels.Length],
            Text = "Hi" + i,
            Timestamp = DateTime.Now.AddMinutes(i * Math.Pow(-1, i))
        });
    }
    
    //Group the data up by label
    var groupedMessages = rawMessages.GroupBy(message => message.Label);
    
    //Convert to a dictionary for by-label lookup (this gives us a Dictionary<string, List<Message>>)
    var messageLookup = groupedMessages.ToDictionary(
                //Make the dictionary key the label of the conversation (set of messages)
                grouping => grouping.Key, 
                //Sort the messages in each conversation by their timestamps and convert to a list
                messages => messages.OrderBy(message => message.Timestamp).ToList());
    
    //Use the data...
    var messagesInConversationA = messageLookup["A"];
    var messagesInConversationB = messageLookup["B"];
    var messagesInConversationC = messageLookup["C"];
    var messagesInConversationD = messageLookup["D"];
    

    【讨论】:

      【解决方案3】:

      在我看来,mlorbetske 对您的问题的解释是正确的。听起来您想要进行分组而不是排序。我只是回答有点不同

      var originalList = new[] { new { Name = "Andy", Label = "Junk" }, new { Name = "Frank", Label = "Junk" }, new { Name = "Lisa", Label = "Trash" } }.ToList();
      
      var myLists = new Dictionary<string, List<Object>>();
      
      originalList.ForEach(x =>
          {
              if (!myLists.ContainsKey(x.Label))                
                  myLists.Add(x.Label,new List<object>());
              myLists[x.Label].Add(x);
      
          });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-06
        • 1970-01-01
        • 1970-01-01
        • 2012-06-06
        • 1970-01-01
        • 2018-01-07
        • 2013-03-19
        • 1970-01-01
        相关资源
        最近更新 更多