簡體   English   中英

C# - 使用LINQ將兩個變量轉換為二維數組?

[英]C# - Using LINQ to take two variables into a 2-dimensional array?

我有一個帶有兩個變量“startLocation”和“endLocation”的“region”類的列表<>。 我想將這兩者組合成一個新的有序二維數組,其中只有Location和一個表示其開始或結束的整數。

例如,如果列表包含三個區域對象

[區域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可以實現更優雅/更快速的方法。

任何建議將不勝感激。

你需要定義一個輔助方法,將一個區域分成兩個部分,使用一個新結構和二維數組來表示它更容易

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);

這不是一個適合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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM