2015-11-02 64 views
1

我有一個類RuleDetail在c#中查詢的LINQ解決方案是什麼?

public class RuleDetail 
{ 
    public int RuleDetailId; 
    public int StartYear; 
} 

我有RuleDetail類型的對象的列表:

RuleDetailId = 1,StartYear = 0
RuleDetailId = 2,StartYear = 2
RuleDetailId = 3,StartYear = 4
RuleDetailId = 4,StartYear = 10
RuleDetailId = 5,StartYear = 13
RuleDetailId = 6,StartYear = 18

我將給出一些說XX總是> = 0);爲此,我需要找到在上面的列表中匹配這些條件RuleDetail對象:

  1. 獲取RuleDetail對象,其中X等於StartYear或
  2. 獲取最大的RuleDetail對象(StartYear)時StartYear < X

假設我有這些變量

RuleDetail[] ruleDetails = null; 
int x = -1; 
// ruleDetails populated 
// x populated 

這是我想出代碼:

bool found = false; 
RuleDetail ruleDetail = null; 
RuleDetail oldRuleDetail = null; 

for (int i=0; i<ruleDetails.Length; i++) 
{ 
    if (ruleDetails[i].StartYear == x) 
    { 
     found = true; 
     ruleDetail = ruleDetails[i]; 
     break; 
    } 
    else if (ruleDetails[i].StartYear > x) 
    { 
     found = true; 
     ruleDetail = oldRuleDetail; 
     break; 
    } 

    oldRuleDetail = ruleDetails[i]; 
} 
if (!found) 
{ 
    ruleDetail = oldRuleDetail; 
} 
return ruleDetail; 

的代碼工作正常。但是我怎麼能在LINQ中做到這一點?

感謝

+2

我不知道你提供的解決方案是正確的?如果'ruleDetails [1] .StartYear == x + 1'和'ruleDetails [2] .StartYear == x'怎麼辦? –

+0

RuleDetails []中的'RuleDetail'對象由StartYear排序。 – ChumboChappati

回答

3
var output = ruleDetails.OrderBy(rule => rule.StartYear).Where(rule => rule.StartYear <= x).Last() 

如果列表已經在StartYear爲了然後....

var output = ruleDetails.Where(rule => rule.StartYear <= x).Last() 
+0

什麼是代碼中的'list'? – ChumboChappati

+0

您的RuleDetails列表 - 如果您確定它們是爲了 - 您可能會失去OrderBy ... – PaulB

+0

好的。你可以改變'list'到'ruleDetails'?它會讓你更容易理解 – ChumboChappati

1
var res1 = (from a in ruleDetails where a.StartYear == x select a).First(); 
var res2 = (from a in ruleDetails orderby a.StartYear where a.StartYear < x select a).Last(); 
+0

2解決方案的問題? – ChumboChappati

+0

您能否請[編輯]解釋爲什麼這段代碼回答這個問題?僅限代碼答案[阻止](http://meta.stackexchange.com/q/148272/274165),因爲他們沒有教導解決方案。 –

1

這裏是一個真正的簡單LINQ片段來完成你想在這裏做什麼。我正在寫這個假設,你的列表是按照你當前的代碼所建議的順序排列的。

我們將首先將列表過濾到目標年份或小於它的條目,然後取最大的剩餘元素。

var filteredList = ruledetails.Where(r => r.StartYear <= targetYear); 
return filteredList.Last; 
2

您可以使用

ruleDetails.FirstOrDefault(rd => rd.StartYear == x) 
    ?? ruleDetails.Where(rd => rd.StartYear < x).OrderByDescending(rd => rd.StartYear).First(); 

這是你的兩個要求,明確分工,但它實際上是更簡潔使用

ruleDetails.Where(rd => rd.StartYear <= x).OrderByDescending(rd => rd.StartYear).First() 
1

它還挺嚴重的,但也許像:

 var result = ruleDetails 
      .OrderBy(r => r.StartYear) 
      .FirstOrDefault(r => r.StartYear == x || r.StartYear == ruleDetails.Select(y => y.StartYear).Max()); 
1

(A)如果該列表由StartYear最初排序,然後

var result = ruleDetails.LastOrDefault(r => r.StartYear <= startYear); 

(B)如果列表不排序,然後

var result = ruleDetails.Where(r => r.StartYear <= startYear) 
    .Aggregate((RuleDetail)null, (a, b) => a == null || a.StartYear < b.StartYear ? b : a); 
相關問題