Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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时按原始索引重新排序_C#_Linq - Fatal编程技术网

C# 使用Linq时按原始索引重新排序

C# 使用Linq时按原始索引重新排序,c#,linq,C#,Linq,我四处寻找这个问题的解决办法,虽然我也找到了类似的办法,但我找不到这个具体问题的答案。我已经概括了这个问题,但它是这样的: 我有以下int[] [423] [234] [5] [79] [211] [1001] 我希望使用linq仅选择小于200或大于300的条目,然后按原始数组索引排序,以便保证最终数组为: [423] [5] [79] [1001] 当您使用可枚举筛选对象时,其中保留原始顺序: LINQ到对象,不保留顺序 再多说几句。您可以将Where视为foreach循环中的简单过滤元

我四处寻找这个问题的解决办法,虽然我也找到了类似的办法,但我找不到这个具体问题的答案。我已经概括了这个问题,但它是这样的:

我有以下int[]

[423]
[234]
[5]
[79]
[211]
[1001]
我希望使用linq仅选择小于200或大于300的条目,然后按原始数组索引排序,以便保证最终数组为:

[423]
[5]
[79]
[1001]

当您使用
可枚举筛选对象时,其中
保留原始顺序:

LINQ到对象,不保留顺序

再多说几句。您可以将
Where
视为foreach循环中的简单过滤元素,该元素按项目进入循环的顺序逐个返回项目。像这样:

public IEnumerable<T> Where(this IEnumerable<T> sequence, Func<T,bool> predicate)
{
    foreach(var item in sequence)
       if (predicate(item))
           yield return item;
}
public IEnumerable Where(此IEnumerable序列,Func谓词)
{
foreach(序列中的var项目)
if(谓语(项))
收益回报项目;
}

阅读更多信息。

LINQ to object保留选择的顺序,因此一个简单的where子句就可以完成这项工作

在PLINQ中,目标是在保持正确性的同时最大限度地提高性能。查询应尽可能快地运行,但仍能生成正确的结果。在某些情况下,正确性要求保留源序列的顺序;然而,排序在计算上可能很昂贵。因此,默认情况下,PLINQ不保留源序列的顺序。在这方面,PLINQ类似于LINQtoSQL,但与LINQtoObject不同,后者保留了顺序

但是如果需要,可以选择带有值的
索引
,然后在
索引

int[] array = new [] 
{
    423,234,5,79,211,1001
};


 var sortedArray =  array.Select((r, i) => new { value = r, index = i })
                         .Where(t => t.value < 200 || t.value > 300)
                         .OrderBy(o => o.index)
                         .Select(s => s.value).ToArray();
int[]数组=新[]
{
423,234,5,79,211,1001
};
var sortedArray=array.Select((r,i)=>new{value=r,index=i})
其中(t=>t.value<200 | | t.value>300)
.OrderBy(o=>o.index)
.Select(s=>s.value).ToArray();

无需进行任何排序,订单将维持不变

var someInts = new int[] { 423, 234, 5, 79, 211, 1001 };
var filteredInts = someInts.Where(i => i < 200 || i > 300);

// filteredInts = [423, 5, 79, 1001]
var someInts=newint[]{423234,5,792111001};
var filteredInts=someInts.Where(i=>i<200 | | i>300);
//filteredInts=[423,5,791001]

检查我似乎发现,当数组为v.large时,有时顺序不会保留。我的linq表达式非常复杂,但如果我能解决这个简单的例子,那么它就解决了我的主要问题。