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!");
}