我创建了一个类,其中包含一个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字符串。
答案 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();
因此基本上给了我一个关于我想要的方式!!
感谢大家的投入和帮助!
尼尔