2012-07-09 65 views
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; 

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

+0

你实际上是指索引1而不是2吗? – phg 2012-07-09 11:21:41

+0

对不起,应该是1 – chugh97 2012-07-09 11:22:34

+0

然后我只需除以30就可以了(可能加上一些安全检查)。 – phg 2012-07-09 11:23:46

回答

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; 
+0

糟糕,忘了添加编辑评论。在重新阅读您的问题后添加“ - 1”,以便它得到正确的索引 – 2012-07-09 11:32:16

0

您可以使用.TakeWhile()

int periodIndex = periods.TakeWhile(p => p <= overDueDays).Count() - 1; 
0

这个怎么样?因为我们感兴趣的是与范围的上限值比较

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 qPeriods = periods.Where(v => v <= overDueDays) 
          .Select((result, i) => new { index = i }) 
          .Last(); 
+0

以这种方式使用“Where”会改变原始索引,因为只要满足条件,您的项目数就会比您开始的项数少。 – 2012-07-09 13:23:38

+0

我认为,但我会假设如果期间从OP问题“排序”。 – Turbot 2012-07-09 13:53:39

+0

我误解了您的“Where”条件。如果它是'overDueDays 2012-07-09 14:07:49

0

假设periods进行排序,你可以用下面的办法。通过跳过它,指数落到位而不需要减去1.在overDueDays不在任何可用范围之间的情况下使用FirstOrDefault