Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#LINQ-SkipWhile()的反向调用,而不调用reverse()?_C#_Performance_Linq - Fatal编程技术网

C#LINQ-SkipWhile()的反向调用,而不调用reverse()?

C#LINQ-SkipWhile()的反向调用,而不调用reverse()?,c#,performance,linq,C#,Performance,Linq,在此代码中: for (e = 0; e <= collection.Count - 2; e++) { var itm = collection.Read() var itm_price = itm.Price var forwards_satisfied_row = collection .Skip(e + 1) .SkipWhile(x => x.Price <

在此代码中:

    for (e = 0; e <= collection.Count - 2; e++)
    {
        var itm = collection.Read()
        var itm_price = itm.Price

        var forwards_satisfied_row = collection
            .Skip(e + 1)
            .SkipWhile(x => x.Price < ex_price)
            .FirstOrDefault();

        var backwards_satisfied_row = collection
            .Reverse()
            .Skip(collection.Count - e)
            .SkipWhile(x => x.Price < ex_price)
            .FirstOrDefault();
    }
编辑:作为一种解决方法,我正在为左侧搜索者编写一个反向临时文件

    for (i = file.count - 1; i >= 0; i += -1)
    {
        file.SetPointerToItem(i);
        temp_file.Write(file.Read());
    }

无需执行
.Reverse()
然后执行
FirstOrDefault()
,只需使用
LastOrDefault()
。不要使用
跳过(collection.Count-e)
而使用
.Take(e)
元素

    var backwards_satisfied_row = collection
        .SkipWhile(x => x.Price < ex_price)   //Skip till x.Price < ex_price
        .Skip(e+1)                           //Skip first e+1 elements
        .LastOrDefault();                 //Get Last or default value

无需执行
.Reverse()
然后执行
FirstOrDefault()
,只需使用
LastOrDefault()
。不要使用
跳过(collection.Count-e)
而使用
.Take(e)
元素

    var backwards_satisfied_row = collection
        .SkipWhile(x => x.Price < ex_price)   //Skip till x.Price < ex_price
        .Skip(e+1)                           //Skip first e+1 elements
        .LastOrDefault();                 //Get Last or default value

您可以通过一次选择每个项目的先例来提高效率。让我们为枚举创建一个扩展方法,为每个元素选择一个先例:

public static IEnumerable<T> SelectPrecedent<T>(this IEnumerable<T> source,
    Func<T, bool> selector)
{
    T selectedPrecedent = default;
    foreach (var item in source)
    {
        if (selector(item)) selectedPrecedent = item;
        yield return selectedPrecedent;
    }
}

您可以通过一次选择每个项目的先例来提高效率。让我们为枚举创建一个扩展方法,为每个元素选择一个先例:

public static IEnumerable<T> SelectPrecedent<T>(this IEnumerable<T> source,
    Func<T, bool> selector)
{
    T selectedPrecedent = default;
    foreach (var item in source)
    {
        if (selector(item)) selectedPrecedent = item;
        yield return selectedPrecedent;
    }
}

你能告诉我们什么是detailsSystem的输入和预期输出的帖子吗?Linq有一个扩展方法,你能告诉我们什么是detailsSystem的输入和预期输出的帖子吗?Linq有一个扩展方法不确定这是否可行,而SkipWhile是如何找到第一个水平“命中”的。我现在明白了,但在“e”之前,这不会评估整个内容吗?我在使用skipwhile,因此它不必更新我的答案,现在它将首先执行
.skipwhile()
,然后将跳过第一个e元素。用你的输入试试看,否则给我们一些测试数据,这样我就可以在fiddleSo上试试。对于forward_Successed_row’它用Skip(e+1)跳转到当前行+1,然后SkipWhile找到第一个命中,然后FirstOrDefault()返回命中行Yes。请阅读,以便我能在正确的方向上为您提供更多帮助。不确定这是否有效,而SkipWhile是如何找到第一个水平“命中”的。我现在明白了,但在“e”之前,这不会评估整个内容吗?我在使用skipwhile,因此它不必更新我的答案,现在它将首先执行
.skipwhile()
,然后将跳过第一个e元素。用你的输入试试看,否则给我们一些测试数据,这样我就可以在fiddleSo上试试。对于forward_Successed_row’它用Skip(e+1)跳转到当前行+1,然后SkipWhile找到第一个命中,然后FirstOrDefault()返回命中行Yes。请阅读,以便我能在正确的方向上为您提供更多帮助
var precedentArray = collection.SelectPrecedent(x => x.Price < ex_price).ToArray();
var subsequentArray = collection.Reverse()
    .SelectPrecedent(x => x.Price < ex_price).Reverse().ToArray();
for (int i = 0; i < collection.Count; i++)
{
    var current = collection[i];
    var precedent = precedentArray[i];
    var subsequent = subsequentArray[i];
    // Do something with the current, precedent and subsequent
}