簡體   English   中英

連接一個列表的范圍<string>

[英]Concatenate a range of a List<string>

如果我有一個List<string> ,並且我想從列表中的所有元素創建一個string ,我可以使用JoinAggregate如下所示來完成。

var list = new List<string>() { "A", "B", "C", "D", "E" };
var concatAllByJoin = string.Join(string.Empty, list);
var concatAllByAggregate = list.Aggregate((a, b) => a + b);

要么會產生字符串ABCDE

如果我想做同樣的事情,但只針對列表中的某個范圍,該怎么辦。 說,我想連接索引 1 和 3 之間的項目。 換句話說,我希望結果是BCD

我能想到的一種方法是像這樣使用GetRange()

var concatRange = string.Join(string.Empty, list.GetRange(1, 3));

這顯然有效,但問題是數據重復。 我很想知道是否有辦法在沒有重復的情況下做到這一點。

如果你這樣做:

var concatRange = string.Join(string.Empty, list.Skip(1).Take(3));

不會創建另一個列表實例。 但是對於小集合,我認為您會發現額外的列表並不像枚舉器那樣昂貴,而且可能效率更高。 請記住,列表元素僅存儲引用,因此字符串值本身不會使用任一選項進行復制

您可以為此使用StringBuilder

var list = new List<string>() { "A", "B", "C", "D", "E" };

var builder = new StringBuilder();
for (int i = 1; i <= 3; i++)
{
    builder.Append(list[i]);
}

var concatRange = builder.ToString();

它不會創建源列表的任何副本 - 您只需通過索引訪問元素並將它們添加到StringBuilder 您還可以通過在構造函數中傳遞的capacity值來指定項目的最大數量(可以存儲在StringBuilder實例分配的內存中)。

Linq解決方案相比的性能基准測試。 我不認為,它們非常准確,因為源列表太小,但性能差異很大。

在此處輸入圖片說明

暫無
暫無

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

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