C# 集合作为输出参数

C# 集合作为输出参数,c#,collections,C#,Collections,我对收藏的概念很陌生。我有一个类对象军官,它有几个属性,其中三个构成军官的名称 我还有一个单独的类对象Company,它位于Officer对象之上。一家公司包含一组精选的高级职员,因此为了显示高级职员的姓名,我需要在两者之间提供某种形式的参考: private List<Officer> officerList; public void addOfficer(Officer off) { officerList.Add(off);

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

我还有一个单独的类对象Company,它位于Officer对象之上。一家公司包含一组精选的高级职员,因此为了显示高级职员的姓名,我需要在两者之间提供某种形式的参考:

private List<Officer> officerList;
public void addOfficer(Officer off)
        {
            officerList.Add(off);
        }
这就是我所能做到的,因为我很难理解 一个如何实现集合和 b如果这样做是正确的

您不需要修改,因此这就足够了:

public void GetOfficerNames(List<string> names)
{
    foreach (Officer o in officerList)
    {
        names.Add(o.Title + o.ForeName + o.SurName);
    }
}
out主要用于值类型,以。但是,如果需要初始化引用类型,也可以将其与引用类型一起使用。因此,在您的案例中,示例如下所示:

var names = new List<string>();

//...

names.AddRange(GetOfficerNames());
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
    //...
}
然后它会这样使用:

var names = new List<string>();

//...

names.AddRange(GetOfficerNames());
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
    //...
}

然而,这是很少需要的,可读性不强,因此不鼓励使用,也很少使用。

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

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;
}

如果您希望字符串中的每个官员姓名都可以作为枚举或列表访问,那么最好将其设为枚举

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;
            }
        }

您可以创建一个字符串列表,即包含所有官员姓名的列表。然后,您可以通过执行list.addo.Title++o.Forename++o.姓氏来添加它们。这是在for循环中完成的。在for循环之前声明列表。但是,如果要使用out,则必须在调用函数中声明变量。为什么要使用out参数而不是返回值?在void方法中使用out参数是非常奇怪的。我还强烈建议您开始遵循.NET命名约定,因此使用大写字母来开始方法名称。@JonSkeet我需要在另一个类中创建一个列表,以便与asp:ListBox一起使用,使用out参数更容易,因为我可以使用变量类型而不是另一个完整的列表来形成列表。然而,回过头来看,这对我来说几乎没有意义,所以我会考虑做一些不同的事情。至于.NET大会,我试过了。我个人认为这看起来很可怕,所以我遵循惯例直到某一点。例如,如果缩写的意思是显而易见的,我认为没有理由避免使用缩写,不管它的使用范围有多广。但那只是我,我是一个书呆子。如果你忽视.NET命名约定,你将使其他阅读你代码的人的生活变得艰难。你可能不喜欢它,但你仍然应该遵循它。不,我也不明白你评论的第一句话。。。我可以使用一个变量类型而不是另一个对我来说毫无意义的完整列表来形成列表。这里真的没有理由使用out参数。。。如果你认为有,完全有可能你不明白out的意思。看@JonSkeet我不太确定它是否有那么难读。我认为在某些情况下,缩略语和缩略语肯定会变得模糊,但在某些情况下,速记还是有空间的。例如,win本身可能意味着一些不同的事情,但是在方法的上下文中,我们可能有win.Resize。很明显,这是一个窗口,在这种情况下,使用win并避免输入相关疾病是完全合理的。此外,我将通过添加类似于officer.GetName函数的内容,甚至可能通过重载officer.ToString,将officer名称字符串串联封装在officer类中。然后,如果我想在代码中的其他地方得到官员的名字,我可以确保得到相同的结果,并且不必编写两次相同的代码,主要是前者。