C#-使用LINQ将两个变量带入二维数组?
我有一个包含两个变量的“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实现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] [
如果您有任何建议,我们将不胜感激。这不是一个适合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会更快。