[英]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.