Linq - 使用条件逻辑返回集合索引

时间:2012-07-09 11:16:51

标签: 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;

我有一个变量到期日。当vale介于0到29之间时,我想返回0的索引。当介于30 - 59之间时,我想返回索引1.句点列表来自db,因此它不是硬编码的,值可能与此处不同。在一个语句中使用LINQ的最佳方法是什么。

4 个答案:

答案 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不在任何可用范围之间的情况。