1

UserObj に DateTime データ メンバーと文字列 Name メンバーがある List があります。指定された名前 InputName と入力 DateTime InputDT に最も近い DateTime を持つリストで UserObj を見つけたい

Names と DateTimes の両方が発生する可能性がありますが、固有の解決策があります。

私は考えました:

UserObj user = userObjList.Where(u => ((u.Name ==inputName) && (userObjList.Min())).ToList()[0];

しかし、最小条件を指定する方法がわかりませんか?

4

2 に答える 2

8

2 つの日付の絶対差で並べ替えてから、最初の日付を取得します。

UserObj user = userObjList
    .Where(u => u.Name == inputName)
    .OrderBy(u => Math.Abs((u.Date - inputDT).TotalSeconds))
    .First();

またはMinBy拡張機能を使用します。

UserObj user = userObjList
    .Where(u => u.Name == inputName)
    .MinBy(u => Math.Abs((u.Date - inputDT).TotalSeconds));
于 2012-05-16T13:54:06.450 に答える
1

テストされていませんが、次のように動作するはずです...

var validUserObjs = userObjList.Where(u => u.Name ==inputName);
double mintime = validUserObjs.Min(u=>Math.Abs((u.Date-inputDate).TotalSeconds));
var result = validUserObjs.First(u=>Math.Abs((u.Date-inputDate).TotalSeconds)==mintime);

アイデアは、最初にユーザーが有効なuserobjを取得することです。次に、最も近い日付が入力日付からどれだけ離れているかを見つけます。次に、その時差を使用して特定のアイテムを検索します。

順序付けされたものよりもかなり厄介ですが、それを行うにはO(N)である必要があります(リストを通過して最小値を見つけ、次に2番目のパスでそのアイテムを取得します)。私のコードのエラーを微調整する必要があるかもしれませんが、アイデアは正しいです。:)

于 2012-05-16T14:03:49.337 に答える