2012-05-16 81 views
1

我有一個List,UserObj具有DateTime數據成員和字符串名成員。 我想在給定名稱InputName和DateTime最接近輸入DateTime的列表中找到UserObj DateTime InputDTLINQ查詢發現對象查詢輸入變量

名稱和日期時間可能都會發生,但會有獨特的解決方案。

我想過:

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

,但不知道如何指定最起碼的條件?

+0

此外這個問題似乎與最小的部分相關:http://stackoverflow.com/questions/914109/how-to-use-linq-to-select-object-with-minimum-or-maximum-property值。那裏有幾個其他可能的答案。 – Chris

回答

8

按照兩個日期之間的絕對差值對它們進行排序,然後取第一個。

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)); 
+0

我想到了這一點,但它不是最優的,因爲它命令而不是簡單地選擇最小值。 – gwizardry

+1

@ gwizardry:你的數據集有多大? – Chris

+0

可能不是很大~100,但操作可能會頻繁重複,優化一般來說很重要。 – gwizardry

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

的想法是,它得到有效userobjs用戶第一。然後它會發現距離輸入日期最近的日期有多遠。然後通過使用該時間差找到具體項目。

它比給定的順序通過一個更混亂,但它應該是O(N)做到這一點(通過列表中找到最小值,然後第二遍來獲得該項目)。它可能需要對代碼中的錯誤進行一些微調,但這個想法很有道理。 :)