2010-04-23 21 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

相关问题