收集为out参数

Wol*_*ish -1 c# collections

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

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

private List<Officer> officerList;
public void addOfficer(Officer off)
        {
            officerList.Add(off);
        }
Run Code Online (Sandbox Code Playgroud)

现在,要实际将该数据返回到另一个类,我需要创建一个列表(无意义),创建大量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;
            }
        }
Run Code Online (Sandbox Code Playgroud)

这是我所拥有的,因为我很难理解
a)如何实现集合和
b)如果这是正确的事情.

Bar*_*zKP 7

您不需要out修改传递给函数引用类型,因此这就足够了:

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

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

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

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

var names = new List<string>();

//...

names.AddRange(GetOfficerNames());
Run Code Online (Sandbox Code Playgroud)

要不就:

var names = GetOfficerNames().ToList();
Run Code Online (Sandbox Code Playgroud)

out主要用于值类型,使它们通过引用传递.但是,如果需要初始化它们,它也可以与引用类型一起使用.因此,在您的情况下,示例将如下所示:

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

    foreach (Officer o in officerList)
    {
        names.Add(o.Title + o.ForeName + o.SurName);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后它会像这样使用:

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

foreach (var name in officerNames)  // out guarantees officerNames
{                                   //  will be initialized here
    //...
}
Run Code Online (Sandbox Code Playgroud)

然而,这很少需要,不是非常易读,因此不鼓励并且很少使用.