我有一个列表<>具有两个变量“startLocation”和“endLocation”的“region”类。 我想将这两个组合成一个新的有序二维数组,其中只有Location和一个表示其开始或结束的整数。
例如,如果列表中有三个区域对象
[Region 1]:startLocation = 5, endLocation = 7
[Region 2]:startLocation = 3, endLocation = 5
[Region 3]:startLocation = 8, endLocation = 9
我想得到一个排序的二维数组(或列表或类似的),如:
[3] [1]
[5] [1]
[5] [-1]
[7] [-1]
[8] [1]
[9] [-1]
(我希望重叠将第二个值加在一起,所以数组中的两个单独的5将组合成[5 0] ......但这并不太重要)
我目前正在使用常规的forloop逐个浏览并将它们一次添加到列表中。这个实现非常慢,因为我正在使用大型数据集,我猜测通过LINQ可以实现更优雅/更快捷的方式。
我们非常感谢任何建议。
答案 0 :(得分:5)
你需要定义一个辅助方法,将一个区域分成两部分,使用一个新结构和一个二维数组来表示它更容易
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};
}
然后,您可以使用以下LINQ查询来分解它们并对它们进行排序。
List<Region> list = GetTheList();
var query = list
.SelectMany(x => x.Split())
.OrderBy(x => x.Data);
答案 1 :(得分:0)
除了智力练习之外,这不是一个适合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
}