我为什么要将List转换为Array

时间:2013-12-26 04:55:38

标签: c# arrays list

请查看以下代码行:

public string[] GetStringList(params object[] values)
{
    List<string> _stringList = new List<string>();

    foreach (object value in values)
    {
        _stringList.Add(Convert.ToString(value));

        //Do something
    }

    //Why this invalid?
    return _stringList;

    //Why do required to convert list collection in array
    return _stringList.ToArray();
}

由于List和Array都是集合,那么为什么我需要将List转换为Array?

5 个答案:

答案 0 :(得分:6)

  

由于List和Array都是集合,那么我为什么需要将List转换为Array?

是的,它们都是集合,但您的方法签名确切地指定了它返回的类型的集合,这就是您必须准确返回该集合类型的原因。

您可以使用其中一个集合接口更改方法声明以返回字符串集合

public IEnumerable<string> GetStringList(params object[] values)

public ICollection<string> GetStringList(params object[] values)

它允许您返回List<string>string[],因为它们都实现了接口。您也可以返回HashSet<string>甚至Queue<string>(仅适用于IEnumerable<string>版本。或者编写您自己的类,实现您感兴趣的界面并在您的方法中返回。

但是只要您使用string[]声明方法,就必须返回string个数组的内容,而List<string>不符合该要求。

OFT建议

您可以将values.Length作为List<string>构造函数参数传递得更快一些:

List<string> _stringList = new List<string>(values.Length);

它将使用必要的内存量初始化列表内部存储,并允许您添加所有项目而无需重新分配任何内存。

答案 1 :(得分:4)

直接返回列表无效,因为指定的返回类型是数组

          ↓
public string[] GetStringList(params object[] values)

如果你想要返回一个列表,它应该是

public List<string> GetStringList(params object[] values)

如果你想让两者都有效,你可以让方法返回一个IEnumerable(或两个类型实现的另一个接口,如ICollection),如下所示:

public IEnumerable<string> GetStringList(params object[] values)

答案 2 :(得分:3)

ArrayList是两个不同的东西,Dictionary也是一个集合,那么为什么字典和数组是相同的?收藏品种类繁多,彼此不同。如果您不想转换,则应返回list而不是Array。

public List<string> GetStringList(params object[] values)
{
    List<string> _stringList = new List<string>(); 
    foreach (object value in values)        
    {
        _stringList.Add(Convert.ToString(value));
        //Do something
    }
    return _stringList;         
}   

答案 3 :(得分:1)

您的函数会根据需要返回string[]而不是List<string>

public List<string> GetStringList(params object[] values)
    {
        List<string> _stringList = new List<string>();

        foreach (object value in values)
        {
            _stringList.Add(Convert.ToString(value));

            //Do something
        }
        //Why do required to convert list collection in array
        return _stringList;
    }

答案 4 :(得分:1)

正如你所提到的,它们都是集合,这意味着,它们都实现了ICollection,但是像继承一样,最具体的对象是不同的事物,但是某些 相同的特征。例如,假设我们有两类:

class Plant : ILivingOrganism {...}
class Human: ILivingOrganism {...}

他们都实现了ILivingOrganism界面,他们有一些相同的特征,比如void Grow()行为,这意味着他们都可以成长,因为他们是生物有机体,但是事情是它们是两个不同的东西,即使它们具有相同的一些特征。现在当我编写一个返回Plant的方法时,显然你不能指望它返回一个Human而是,返回ILivingOrganism的方法,如{{1}你可以期待任何生物体(更一般的类型),例如ILivingOrganism Clone()Human,技术上实现Plant的所有内容。