0

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

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

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

目前,我一直在通过使用foreach循环并以这种方式检查值来做到这一点——我知道这是对 CPU 时间的可怕浪费和糟糕的编程。我为此感到羞耻。

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

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

4

3 回答 3

3

您尝试过OrderByLinq

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

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

于 2013-01-03T20:55:21.123 回答
1

您说排序,但听起来您正在尝试根据共同值划分事物列表。为此,您需要GroupBy

您还希望ToDictionaryIGrouping切换,因为您可能想要基于键的查找。

我假设每个输出集中的元素都需要排序,因此请查看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"];
于 2013-01-03T21:26:27.897 回答
0

在我看来,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);

    });
于 2013-01-03T21:34:16.183 回答