Linq-使用条件逻辑返回集合索引
我有一个收藏Linq-使用条件逻辑返回集合索引,linq,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 ov
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;
List periods=new List();
期间。添加(0);
增加(30);
增加(60);
增加(90);
增加(120);
增加(180);
var overduedys=31;
我在到期日有一个变量。当值在0到29之间时,我想返回0的索引。在30-59之间时,我想返回索引1。周期列表来自db,因此它不是硬编码的,并且值可以与此处不同。在一个语句中使用LINQ的最佳方式是什么 这并不是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;
List periods=new List();
期间。添加(0);
增加(30);
增加(60);
增加(90);
增加(120);
增加(180);
var overduedys=31;
var结果=periods.IndexOf(periods.First(n=>overduedys
您可以使用.TakeWhile()
:
int periodIndex=periods.TakeWhile(p=>p这个怎么样
var qPeriods = periods.Where(v => v <= overDueDays)
.Select((result, i) => new { index = i })
.Last();
var qPeriods=periods.Where(v=>v new{index=i})
.Last();
假设对期间进行了排序,您可以使用以下方法:
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!");
}
var result=periods.Skip(1)
.Select((o,i)=>new{Index=i,Value=o})
.FirstOrDefault(o=>overduedies
第一个值被跳过,因为我们对与范围的上限值进行比较感兴趣。跳过它,索引就就位了,而不需要减去1。FirstOrDefault
用于Overduedys
不在任何可用范围之间的情况。你真的是指索引1而不是2吗?那么我会只需除以30就可以了(可能还有一些安全检查)。哎呀,忘了添加编辑注释。添加了“-1”在重新阅读您的问题以使其获得正确的索引后,使用Where
这种方式将改变原始索引,因为无论何时满足该条件,您的项目都将少于开始时的项目。我也这么认为,但我会假设周期是从OP问题中排序的。我误读了您的Where
条件。如果它是overduedys
,我的原始语句将适用,但您的设置不同。
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!");
}