最有效的方法是将Char的集合传递给人口方法

时间:2010-04-23 22:55:44

标签: c# collections

这是收集字符集的最佳方式吗?想知道使用List作为char这样的原语是否过度了?

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

3 个答案:

答案 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>