我有一个集合
List<int> periods = new List<int>();
periods.Add(0);
periods.Add(30);
periods.Add(60);
periods.Add(90);
periods.Add(120);
periods.Add(180);
var overDueDays = 31;
我有一个变量到期日。当vale介于0到29之间时,我想返回0的索引。当介于30 - 59之间时,我想返回索引1.句点列表来自db,因此它不是硬编码的,值可能与此处不同。在一个语句中使用LINQ的最佳方法是什么。
答案 0 :(得分:0)
这不是Linq的设计目的,但是(假设范围不固定)你可以做以下事情来获得索引
List<int> periods = new List<int>();
periods.Add(0);
periods.Add(30);
periods.Add(60);
periods.Add(90);
periods.Add(120);
periods.Add(180);
var overDueDays = 31;
var result = periods.IndexOf(periods.First(n => overDueDays < n)) - 1;
答案 1 :(得分:0)
您可以使用.TakeWhile()
:
int periodIndex = periods.TakeWhile(p => p <= overDueDays).Count() - 1;
答案 2 :(得分:0)
怎么样?
var qPeriods = periods.Where(v => v <= overDueDays)
.Select((result, i) => new { index = i })
.Last();
答案 3 :(得分:0)
假设periods
已排序,您可以使用以下方法:
var result = periods.Skip(1)
.Select((o, i) => new { Index = i, Value = o })
.FirstOrDefault(o => overDueDays < o.Value);
if (result != null)
{
Console.WriteLine(result.Index);
}
else
{
Console.WriteLine("Matching range not found!");
}
跳过第一个值,因为我们有兴趣与范围的上限值进行比较。通过跳过它,索引就会到位,而不需要减去1. FirstOrDefault
用于overDueDays
不在任何可用范围之间的情况。