2010-04-23 23 views
3

這是獲取字符集合的最佳方法嗎?想知道使用List來處理像char這樣的基元會有多大用處?最有效的方法是將Char的一個集合傳遞給人口的方法

private void GetChars(ref List<char> charsToPopulate) 
{ 
    foreach(Thing t in Things) 
    { 
     charsToPopulate.Add(t.CharSymbol); 
    } 
} 
+1

你並不需要使用'ref'這裏。您已經將參考傳遞給您的列表(因爲列表是參考類型)。 – 2010-04-23 23:20:04

+2

不需要添加snarky標籤。 – ChaosPandion 2010-04-23 23:30:12

回答

1

你會想按值傳遞的參考名單,而不是參考:

private void GetChars(List<char> charsToPopulate) 

除此之外,你的代碼是好的。對原始類型使用列表(如char)非常常見。


如果您有興趣編寫相同的實現略有不同,你可以使用LINQ從東西填充列表:

{ 
    charsToPopulate.AddRange(from t in things select t.CharSymbol); 
} 

BTW,沒有什麼不妥之內創建列表方法。你不需要將它傳遞給方法之前,「分配」名單:

private List<char> GetChars() 
{ 
    List<char> charsToPopulate = new List<char>(); 
    foreach(Thing t in Things) 
    { 
     charsToPopulate.Add(t.CharSymbol); 
    } 
    return charsToPopulate; 
} 

或使用LINQ:

private List<char> GetChars() 
{ 
    return things.Select(t => t.CharSymbol) 
       .ToList(); 
} 
1

最有效的方法是接收字符預分配的陣列,以你會寫元素。當然,這需要事先知道尺寸。

第二個最有效的方法是在該方法內分配數組,然後填充它。這仍然需要一些能力來快速計算Things的大小,但至少可以將其隱藏起來。

如果沒有辦法事先確定大小(例如Things是一個足夠大的緩存而不可行的延遲序列),那麼您的解決方案可能會達到最佳效果。

3

使用惰性序列將爲您提供大量的靈活性,使您可以使用字符。你真的應該重構這個方法。

private IEnumerable<char> GetChars(IEnumerable<Thing> things) 
{ 
    return things.Select(thing => thing.CharSymbol); 
} 

這樣,他們可以把它包裝成任何收集他們想:

var list = GetChars(Things).ToList(); 
var array = GetChars(Things).ToArray(); 

或刪除方法一起:

var chars = Things.Select(thing => thing.CharSymbol).ToList(); 
+0

+1。優秀的答案:-) – dtb 2010-04-23 23:47:19

+0

同意,很好的答案。 :-) – Jaxidian 2010-04-24 00:07:20

+0

謝謝 - 這真的證明了LINQ的力量。 – guazz 2010-04-25 07:54:16

相關問題