2013-01-03 93 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); 

    });