代码之家  ›  专栏  ›  技术社区  ›  Clinton Pierce

使用linq选择列表中的一系列成员

  •  9
  • Clinton Pierce  · 技术社区  · 15 年前

    给出如下元素列表:

    int[] ia = new int[] { -4, 10, 11, 12, 13, -1, 9, 8, 7, 6, 5, 4, -2, 
                            6, 15, 32, -5, 6, 19, 22 };
    

    在linq中,有没有一种简单的方法可以按照“选择从-1到下一个负数(或列表耗尽)的元素”这样的行来做一些事情?一个成功的结果-1将是(-1,9,8,7,6,5,4)。使用-2将得到结果(-2,6,15,32)。

    不是作业问题。我只是在看一个使用 bool A for 循环和 if 想知道有没有更干净的方法。

    4 回复  |  直到 15 年前
        1
  •  11
  •   Erik van Brakel scottrakes    15 年前

    看看 TakeWhile LINQ扩展方法。从列表中获取项,只要条件为true,则跳过其余项。

    例子:

    int[] ia = new int[] { -4, 10, 11, 12, 13, -1, 9, 8, 7, 6, 5, 4, -2, 
                            6, 15, 32, -5, 6, 19, 22 };
    
    var result = ia
                 .SkipWhile(i => i != -1)
                 .Skip(1)
                 .TakeWhile(i => i >= 0);
    

    注意滑水后的跳跃(1)。skipwhile跳过所有内容,但不包括匹配的元素。takewhile然后获取项,直到但不包括匹配元素。因为-1不大于或等于零,所以会得到一个空结果。

        2
  •  5
  •   Anders Abel    15 年前

    更新的

    这次我测试了代码…使用takewhile的双参数形式,我们可以强制它接受第一个元素 (j == 0) 即使是在 i 不满意。

    ia.SkipWhile(i => i != -1).TakeWhile((i, j) => i >= 0 || j == 0)

    TakeWhile(Func<int, int, bool>) 需要接受两个参数的函数/lambda。第一个是要测试的值,第二个是元素的索引。

        3
  •  0
  •   David Basarab    15 年前

    一定是林肯吗?您可以使用扩展方法来获得更清晰的解决方案。

    int[] ia = new int[] { -4, 10, 11, 12, 13, -1, 9, 8, 7, 6, 5, 4, -2, 
                            6, 15, 32, -5, 6, 19, 22 };
    
    // Call the Extension method
    int[] results = ia.SelectRangeLoop(-2);
    
    // Print Results
    for (int i = 0; i < results.Length; i++)
    {
        Console.Write(" {0} ", results[i]);
    }
    

    selectRangeLoop的方法如下。

    public static int[] SelectRangeLoop(this int[] value, int startNumber)
    {
        List<int> results = new List<int>();
    
        bool inNegative = false;
    
        for (int i = 0; i < value.Length; i++)
        {
            if (value[i] == startNumber)
            {
                inNegative = true;
    
                results.Add(value[i]);
    
                continue;
            }
    
            if (inNegative && value[i] < 0)
            {
                break;
            }
    
            if (inNegative)
            {
                results.Add(value[i]);
            }
        }
    
        return results.ToArray();
    }
    
        4
  •  0
  •   Rony    15 年前
    var first = ia.Select((i, index) => new {i, index}).Where((i, index) => i.i == x).First();
    var ind = first.index;
    var second = ia.SkipWhile( (i, index) => index <= ind).TakeWhile(i => i > 0);
    var ints = new[]{first.i}.Union(second);