C# - 使用LINQ将两个变量转换为二维数组?

时间:2009-05-05 00:03:38

标签: c# linq

我有一个列表<>具有两个变量“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可以实现更优雅/更快捷的方式。

我们非常感谢任何建议。

2 个答案:

答案 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
}