3

アイテムの一般的なリストがあります。各項目には DateTime フィールドが含まれています。最もエレガントで効率的な方法で Linq を使用して、リスト内の最新の項目を見つけたいと思います。

私の場合、エレガンスは効率よりも重要ですが、これも効率的な方法で行うとよいでしょう。

ありがとうございました。

答えを読んだ後:これがコードです(そして私が気に入った答え):

using System.Collections.Generic;
using System.Linq;

class Item
{
    public Item Date { get; set; }
    public string Name { get; set; }
}

static void Main(string[] args)
{
    List<Item> items = CreateItems();
    Item newest;
    if (items.Count == 0)
        newest = null;
    else
        newest = items.OrderByDescending(item => item.Date).First();
}
4

5 に答える 5

7

優雅さのために、私は日時フィールドに基づいてセットをソートし、次のような最初のアイテムを返すことによって行きます:

set.OrderByDescending(x => x.DateTime)
   .FirstOrDefault();

これにより、ソートされたコレクションのメモリ内表現が作成されるため、効率はそれほど良くありません。ソートされていないセットの最も効率的な解決策は、すべてのアイテムをループして最新のものを保存することです。構文的に混乱している集約操作を実行することで、これにlinqを使用できます。

または、SortedSetなどの並べ替えられたコレクションにアイテムを保存することもできます。これは、ほとんどのコレクションでO(1)ではなく0(log2)の挿入時間が少し複雑ですが、日時をすぐに並べ替えることができるため、O(n)ではなくO(1)で最新のアイテムを選択できます。

于 2012-05-30T05:40:04.387 に答える
7

これまでのソリューションのほとんどは、(OrderByDescending を使用して) 最初にリストを完全に並べ替える必要があり、これは不要で時間がかかります。必要なのは、Jon Skeet のMoreLinq MaxBy関数です。MaxBy のソースはgoogle codeにあります。

var newest = thelist.MaxBy(x => x.DateTimeField);
于 2012-05-30T05:55:44.720 に答える
3

それを試してください:

var newItem = myList.OrderByDescending(item => item.yourDateTimeField).First();
于 2012-05-30T05:26:09.197 に答える
0

Aggregate を試してください。つまり、次のようなものです。

list.Aggregate (
    DateTime.MinValue,
    (lastOne, current) => current.GreaterThan (lastOne) ? current : lastOne
)

つまり、フィールドが DateTimeField の場合、次のように記述する必要があります。

list.Aggregate (
    null,
    (lastOne, current) => 
        (lastOne == null) ||
             current.DateTimeField.GreaterThan (lastOne.DateTimeField)
        ? current
        : lastOne
)
于 2012-05-30T05:25:53.843 に答える
0

これを試してください

 sortlist.OrderByDescending(a => a.timeStamp).First();
于 2012-05-30T05:47:03.210 に答える