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,我有一个包含两个变量的“region”类列表,“startLocation”和“endLocation”。 我想将这两个元素组合成一个新的排序二维数组,其中它的位置和一个整数表示它的开始还是结束 例如,如果列表中有三个具有 [区域1]:位置=5, endLocation=7 [区域2]:位置=3, 结束位置=5 [区域3]:位置=8, endLocation=9 我希望得到一个排序的二维数组(或列表或类似的数组),如下所示: [3] [1] [5] [1] [5] [-1] [7] [-1] [

我有一个包含两个变量的“region”类列表,“startLocation”和“endLocation”。 我想将这两个元素组合成一个新的排序二维数组,其中它的位置和一个整数表示它的开始还是结束

例如,如果列表中有三个具有

[区域1]:位置=5, endLocation=7

[区域2]:位置=3, 结束位置=5

[区域3]:位置=8, endLocation=9

我希望得到一个排序的二维数组(或列表或类似的数组),如下所示:

[3] [1]

[5] [1]

[5] [-1]

[7] [-1]

[8] [1]

[9] [-1]

(我希望重叠部分将它们的第二个值加在一起,这样数组中两个独立的5就可以组合成[5 0]……但这并不太重要)

目前,我正在使用一个常规的forloop逐个遍历,并将它们一次一个地添加到列表中。这个实现相当慢,因为我使用的是大型数据集,我猜有一种更优雅/更快的方法可以通过LINQ实现


如果您有任何建议,我们将不胜感激。

这不是一个适合LINQ的解决方案,除了智力练习。一个
foreach
循环将和任何拼凑在一起的LINQ实现一样快(实际上可能更快)

作为旁注,我假设您使用的是
foreach
,而不是
for
。如果没有,那么您可以通过切换到
foreach
循环来显著加快流程

foreach(Region r in regionList)
{
    // add your entries using r
}
将比……快得多

for(int i = 0; i < regionList.Count; i++)
{
    // add your entires using the indexer
}
for(int i=0;i
您需要定义一个助手方法,将一个区域拆分为两部分,使用新的结构与二维数组来表示这一点要容易得多

struct Data {
  public int Value;
  public bool IsStart;
}

public static IEnumerable<Data> Split(this Region region) {
  yield return new Data() { Value = region.StartLocation, IsStart=true};
  yield return new Data() { Value = region.EndLocation, IsStart=false};
}
struct数据{
公共价值观;
公共图书馆启动;
}
公共静态IEnumerable拆分(此区域){
yield return new Data(){Value=region.StartLocation,IsStart=true};
yield return new Data(){Value=region.EndLocation,IsStart=false};
}
然后您可以使用下面的LINQ查询将它们分解并排序

List<Region> list = GetTheList();
var query = list
  .SelectMany(x =>  x.Split())
  .OrderBy(x => x.Data);
List List=GetTheList();
var query=list
.SelectMany(x=>x.Split())
.OrderBy(x=>x.Data);

这听起来是个好主意。让我试一试,看看它是否比我现在的速度快。谢谢为什么这不是.SelectMany(x=>x.Split())?这种方法(没有双关语!)与foreach相比没有任何好处,事实上,在这里使用多个枚举数会带来更多开销。它确实很聪明,但我不认为它更快或更可读。@Adam,一致同意的性能可能是个问题。就绝对值而言,它肯定比单个foreach块慢。但只有探查器才能判断在这个特定应用程序中差异是否显著。我倾向于首先选择正确、可读的解决方案,然后让探查器告诉我在哪里进行优化。这接近于聪明与可读,但OP要求LINQ,所以我有点乐趣;)@Jared:从技术上讲,它甚至不是LINQ=P,只是扩展方法和lambdas!;)有人能告诉我这张foreach/性能差异的来源吗?我在几个地方看到过它被引用为福音,但没有我可以运行的测试场景的源代码。我运行的每个测试都有这两种方法,一种是使用列表稍微快一点,另一种是使用数组稍微快一点,但其他人似乎都认为一种方法比另一种方法快很多(尽管这两种方法似乎有所不同).foreach对于动态大小的集合(如列表)更快,因为列表上的索引器不像数组那样指向相对内存插槽。数组上的索引器速度更快,因为它没有创建枚举数和在每次迭代中进行边界检查的(轻微)开销。在他的场景中,他使用的是一个列表,所以是的,foreach会更快。