收集为out参数

时间:2014-11-11 10:10:37

标签: c# collections

我对收藏概念很陌生。我有一个类对象(Officer),它有几个属性,其中三个构成了军官的名字。

我还有一个名为Company的单独的类对象,它位于Officer对象的上方。 company包含一系列官员,因此要显示官员的姓名,我需要在两者之间采用某种形式的参考:

private List<Officer> officerList;
public void addOfficer(Officer off)
        {
            officerList.Add(off);
        }

现在,要将该数据实际返回到另一个类,我需要创建一个列表(无意义),创建大量Officer个对象(效率低下),或者返回一个集合。

public void getOfficerNames(out *something* names) //I want to use a collection 
                                                         //here... I think
        {
            foreach (Officer o in officerList)
            {
                names = o.Title
                      + o.ForeName
                      + o.SurName;
            }
        }

据我所知,因为我很难理解
a)如何实施收集和 b)如果做对了。

3 个答案:

答案 0 :(得分:7)

您不需要out来修改reference type passed to a function,所以这就足够了:

public void GetOfficerNames(List<string> names)
{
    foreach (Officer o in officerList)
    {
        names.Add(o.Title + o.ForeName + o.SurName);
    }
}

此外,只返回名称会更具可读性:

public IEnumerable<string> GetOfficerNames()
{
    return officerList.Select(o => o.Title + o.ForeName + o.SurName);
}

然后你可以像这样使用它:

var names = new List<string>();

//...

names.AddRange(GetOfficerNames());

或者只是:

var names = GetOfficerNames().ToList();

out主要用于make them being passed by reference的值类型。但是,如果需要初始化它们,它也可以与引用类型一起使用。因此,在您的情况下,示例将如下所示:

public void GetOfficerNames(out List<string> names)
{
    names = new List<string>();

    foreach (Officer o in officerList)
    {
        names.Add(o.Title + o.ForeName + o.SurName);
    }
}

然后会像这样使用:

List<string> officerNames;  // uninitialized
GetOfficerNames(out officerNames);

foreach (var name in officerNames)  // out guarantees officerNames
{                                   //  will be initialized here
    //...
}

然而,这很少需要,不是很易读,因此不鼓励,很少使用。

答案 1 :(得分:3)

您是否考虑过将字符列表作为字符串返回?

public List<string> getOfficerNames()
{
    List<string> names = new List<string>;
    foreach (Officer o in officerList)
            {
                names.Add(o.Title + o.ForeName + o.SurName);
            }
    return names;
}

答案 2 :(得分:1)

如果您希望字符串中的每个人员姓名都可以作为枚举或列表访问,我认为您可以更好地将其作为枚举

public IEnumerable<string> getOfficerNames() //I want to use a collection 
                                                         //here... I think
        {
            foreach (Officer o in officerList)
            {
                yield return o.Title + " " + o.ForeName + " "+  o.SurName;
            }
        }