C#:类返回值 - 还是有更好的方法?

时间:2009-09-28 13:47:33

标签: c#

我创建了一个类,其中包含一个List类型的成员。然后,我可以使用ClassNameInstance.Add()添加此内容。

我们现在使用来自第三方的一些代码,这些代码将自动使用我创建的任何类及其值。列表除外。它只返回列表中的第一个元素。

我需要的是为此第三方代码返回的逗号分隔版本。现在我可以将字符串附加到String成员,但这看起来不像.Add()方法。

所以我想创建自己的Class,我可以使用Add()方法但是可以像这样访问它的单个值:

MyClass1.Add("Test1");
MyClass1.Add("Test2");

Console.WriteLine(MyClass2);

我想要的输出是Test1, Test2。我希望这是有道理的!

UPDATE1:

似乎上面可能还不清楚。

public class MyClass1
{
    ????
}

public class MyClass2
{
    MyClass1 mc1 { get; set; }
    String name { get; set; }
}

第三方代码将使用MyClass2及其指定的值。当我使用List而不是MyClass1时,我只获得列表中的第一个值,但需要CSV列表作为返回的字符串。

MyClass2 mc2 = new MyClass2();

mc2.mc1.Add("Test1");
mc2.mc1.Add("Test2");

Console.WriteLine(mc2.mc1) should output -> Test1, Test2

希望能更清楚一些事情!

谢谢大家! :)

UPDATE2:

似乎每个人都在暗示同样的事情 - 使用ToString()。

不幸的是,第三方代码会查看我的类并自动确定成员类型和值。这意味着我无法将代码传递给调用ToString()返回的值。

我需要List<>的添加/删除功能但在使用时,其值将返回单个CSV字符串。

6 个答案:

答案 0 :(得分:8)

我不确定你需要额外的课程:

List<string> list = new List<string>();
list.Add("Test1");
list.Add("Test2");
Console.WriteLine(string.Join(", ", list.ToArray());

可以将这种行为包装在一个类中,只是为了在ToString上自动调用它:

public sealed class StringJoiningList
{
    private readonly List<string> list = new List<string>();

    public void Add(string item)
    {
        list.Add(item);
    }

    public override string ToString()
    {
        return string.Join(", ", list.ToArray());
    }
}

现在假设您只想要一个List<string> - 它也不允许您访问其他项而不是ToString()方法。如果您能提供更多信息,当然所有这些都是可以解决的。你甚至只能从List<T>派生

public class StringJoiningList<T> : List<T>
{
    public override string ToString()
    {
        return string.Join(", ", this.Select(x => x.ToString()).ToArray());
    }
}

我不完全确定我喜欢这个想法,但这取决于你需要做什么......

答案 1 :(得分:1)

一些简单的选项是覆盖类的ToString()方法(以便在此上下文中使用它时返回以逗号分隔的项列表)或者您可以提供一个扁平列表的属性

答案 2 :(得分:0)

您需要实现ToString方法。

答案 3 :(得分:0)

最简单的解决方案可能是继承StringCollection类,只是重写ToString。否则这门课已经有了你要问的一切。

public class MyClass : System.Collections.Specialized.StringCollection
{
    public override string ToString()
    {
        var c = new string[this.Count];
        this.CopyTo(c,0);
        return string.Join(",", c);

    }
}

然后你可以像以前一样使用它。对于这种简单的用法,无需使用泛型。

编辑:

类本身没有返回值,因此第三方代码必须是读取属性。您应该能够如上所述覆盖ToString(),然后公开一个返回ToString()的属性。这可能会使字符串值对第三方代码可见

public class MyClass : System.Collections.Specialized.StringCollection
{
    public string MyValue
    {
        get { return this.ToString(); }
    }

    public override string ToString()
    {
        var c = new string[this.Count];
        this.CopyTo(c,0);
        return string.Join(",", c);

    }
}

答案 4 :(得分:0)

这是我为加入IEnumerable&lt; T&gt;

中的项目所写的扩展程序
public static string Join<T>(this IEnumerable<T> collection, 
                             string separator, Func<T, object> selector)
{
    if (null == separator)
        throw new ArgumentException("separator");
    if (null == selector)
        throw new ArgumentException("selector");

    Func func = item =>
    {
        var @object = selector(item);
        return (null != @object) ? @object.ToString() : string.Empty;
    };
    return string.Join(separator, collection.Select(func).ToArray());
}

可以像这样使用:

List<Person> list = new List<Person>()
{
    new Person() { FirstName = "Magic", LastName = "Johnson" },
    new Person() { FirstName = "Michael", LastName = "Jordon" },
    new Person() { FirstName = "Larry", LastName = "Bird" }
};

var value = list.Join(", ", p => p.FirstName);

// value is "Magic, Michael, Larry"

答案 5 :(得分:0)

不是我想要的答案,但似乎我不能做我想做的事。

在我希望将第二个类作为成员的类中,我将该成员设为String,以便第三方代码可以按我的意愿工作。

我创建了第二个类,其中List<String>作为公共成员,然后是一个名为.ToCSV()的方法,将列表输出为csv字符串。我添加了一个.Add()方法,将字符串添加到列表中,以节省必须Class1.Class2.Add()

然后就在第三方代码使用我的课程之前,我会这样做:

MyClass1.MyString = MyClass2.ToCSV();

因此基本上给了我一个关于我想要的方式!!

感谢大家的投入和帮助!

尼尔