C# 在c中,这个查询的LINQ解决方案是什么?

C# 在c中,这个查询的LINQ解决方案是什么?,c#,linq,C#,Linq,我有一个类规则详细信息: 我有一个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 我将得到一个数字,即x x始终>=0;为此,我需要在上面的列表中找到与这些条件匹配的RuleDet

我有一个类规则详细信息:

我有一个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

我将得到一个数字,即x x始终>=0;为此,我需要在上面的列表中找到与这些条件匹配的RuleDetail对象:

获取RuleDetail对象,其中x等于StartYear或 当StartYear
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代码片段来完成您在这里要做的事情。我写这篇文章的假设是,您的列表是按当前代码所建议的顺序排列的

我们将首先筛选列表中目标年份或少于目标年份的条目,然后获取剩余的最高元素

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

这里有一个真正简单的LINQ代码片段来完成您在这里要做的事情。我写这篇文章的假设是,您的列表是按当前代码所建议的顺序排列的

我们将首先筛选列表中目标年份或少于目标年份的条目,然后获取剩余的最高元素

var filteredList = ruledetails.Where(r => r.StartYear <= targetYear);
return filteredList.Last;
如果列表已按开始顺序排列,则

var output = ruleDetails.Where(rule => rule.StartYear <= x).Last()
如果列表已按开始顺序排列,则

var output = ruleDetails.Where(rule => rule.StartYear <= x).Last()
你可以用

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()
你可以用

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

有点恶心,但可能是:

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

有点恶心,但可能是:

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

A如果列表最初是按StartYear排序的,则

B如果列表未排序,则

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

A如果列表最初是按StartYear排序的,则

B如果列表未排序,则

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

我不确定您提供的解决方案是否正确?如果ruleDetails[1].StartYear==x+1和ruleDetails[2].StartYear==x怎么办?ruleDetails[]中的RuleDetail对象是按StartYear排序的。我不确定您提供的解决方案是否正确?如果ruleDetails[1].StartYear==x+1和ruleDetails[2].StartYear==x会怎么样?ruleDetails[]中的RuleDetail对象是按StartYear排序的。您的ruleDetails列表-如果您确定它们是按顺序排列的-您可能会丢失OrderBy…确定。你们能把清单改成规则细节吗?这将使您更容易理解,您不需要AsEnumerable-列表和数组实现IEnumerable。您的规则详细信息列表-如果您确定它们是有序的-您可能会丢失OrderBy…好的。你们能把清单改成规则细节吗?这将使它更容易理解,您不需要AsEnumerable-List和Array实现IEnumerable.2问题的解决方案?请您解释一下为什么这段代码会回答这个问题?只有代码的答案是,因为他们不教解决方案。问题的2个解决方案?你能解释一下为什么这个代码回答这个问题吗?代码唯一的答案是,因为他们不教解决方案。