![](/img/trans.png)
[英]Concatenate<T>(List<T> list, string specifiedPropertyOfT)?
[英]Concatenate a range of a List<string>
如果我有一個List<string>
,並且我想從列表中的所有元素創建一個string
,我可以使用Join
或Aggregate
如下所示來完成。
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.