0

カスタムプロパティでC#のオブジェクトのコレクションを並べ替えようとしています。(コンテキストとして、Twitterizerライブラリを使用してTwitter APIを使用し、ダイレクトメッセージを会話ビューに並べ替えています)

カスタムクラスに、という名前のプロパティがあるとします。labelここで、はクラスコンストラクターのときに割り当てられます。labelstring

私は上記のクラスのCollection(またはList、それは問題ではありません)を持っており、それらすべてをの値に基づいて別々Listのs(またはs)に分類し、それらをグループ化したいです。Collectionlabel

現時点では、foreachループを使用して値をチェックすることでこれを行っています。これは、CPU時間のひどい浪費とひどいプログラミングです。恥ずかしいです。

基本的に、私が持っているすべてのデータが私に与えられていることを知っています。また、それが本当に簡単にソートできるはずであることも知っています。人間が紙片でそれを行うのは簡単ですが、C#でそれを行う方法がわかりません。

誰かがこれに対する解決策を持っていますか?より多くの情報やコンテキストが必要な場合は、質問してください。

4

3 に答える 3

3

LinqOrderByを試しましたか?

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

これはまだ値をループしてソートします-それを回避する方法はありません。これにより、少なくともコードがクリーンアップされます。

于 2013-01-03T20:55:21.123 に答える
1

並べ替えと言っていますが、共通の値に基づいてリストを分割しようとしているように聞こえます。そのためには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"];
于 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 に答える