这是收集字符集的最佳方式吗?想知道使用List作为char这样的原语是否过度了?
private void GetChars(ref List<char> charsToPopulate)
{
foreach(Thing t in Things)
{
charsToPopulate.Add(t.CharSymbol);
}
}
答案 0 :(得分: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();
答案 1 :(得分:1)
您需要按值传递对列表的引用,而不是通过引用传递:
private void GetChars(List<char> charsToPopulate)
除此之外,您的代码还可以。使用char
等基本类型的列表非常常见。
如果您对编写相同的实现略有不同感兴趣,可以使用LINQ从列表中填充列表:
{
charsToPopulate.AddRange(from t in things select t.CharSymbol);
}
顺便说一句,在方法中创建列表没有任何问题。在将列表传递给方法之前,您无需“分配”列表:
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();
}
答案 2 :(得分:1)
最有效的方法是接收一个预分配的字符数组,您可以在其中编写元素。当然,这需要事先知道尺寸。
第二个最有效的方法是在方法中分配数组,然后填充它。这仍然需要一些快速计算Things
大小的能力,但至少要将其隐藏在调用者之外。
如果没有办法提前找出大小(例如Things
是一个足够大的延迟序列,缓存它是不可行的),那么你的解决方案可能会很好。< / p>