2015-11-02 68 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);