2013-01-03 92 views
0

我想通过自定义属性对C#中的对象集合进行排序。 (对于背景下,我使用的Twitterizer库Twitter的API的工作,分选直接信息到会话视图)C# - 按属性排序

说自定义类有一个名为label财产,其中labelstring分配类的构造函数时。

我有一个Collection(或List,没关系)的所说类,我想他们都整理到基于的label值单独List S(或Collection S),以及它们组合在一起。我知道,目前我一直在使用foreach循环并检查这些值 - 这是一个可怕的CPU时间浪费和糟糕的编程。我很惭愧。

基本上我知道我拥有的所有数据都在那里给我,而且我也知道它应该很容易分类。对于一个人来说,使用小纸片很容易,但我不知道如何在C#中做到这一点。

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

+4

'CPU时间和糟糕的编程可怕的浪费?'你在说什么?如果你有一个集合,那就是你如何对它进行排序 - 你迭代这些项目。没有真正的解决方法。 – Oded

+0

可能的重复[如何排序基于属性的C#列表工作?](http://stackoverflow.com/questions/8002605/how-does-sorting-ac-sharp-list-based-on-a-property -工作) – DocMax

回答

2

你试过LinqOrderBy

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

这仍然要遍历值排序 - 还有周围没有办法。这至少会清理你的代码。

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"]; 
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); 

    });