C# 在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;为此,我需要在上面的列表中找到与这些条件匹配的RuleDetail对象: 获取RuleDetail对象,其中x等于StartYear或 当StartYearC# 在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[] 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个解决方案?你能解释一下为什么这个代码回答这个问题吗?代码唯一的答案是,因为他们不教解决方案。