如何覆盖集合的 ToString() 方法?
List<Place> spisok = new List<Place>();
for (int i = 0; i < 20; i++)
spisok.Add(new Place(PlaceStatus.Free));
我想在打电话时spisok.ToString()
收到格式为 0,0,0,0 的字符串(即用逗号分隔的元素)
或者类似的这样一个集合
var spisok = new Place[20];
for (int i = 0; i < 20; i++)
spisok[i] = new Place(PlaceStatus.Free));
下面是使用的元素的代码。在类中我试图重载 ToString() 方法,当对象为 1 时,它会给出数值。但在数组的情况下,这是文本 - 关于类的记录
public enum PlaceStatus
{
Free,
Booked,
Paid,
Confirmed
}
public class Place
{
public PlaceStatus Status { get; set; }
public Place(PlaceStatus status)
{
Status = status;
}
public override string ToString()
{
return ((int)Status).ToString();
}
}
创建一个静态助手类。它看起来像这样:
然后在您的代码中使用:
UPD:
以前的版本是一个扩展,因为您不能为现有集合显式覆盖 ToString()。但是,如果您需要第三方方法来调用您的集合到您需要的字符串的转换,您将必须创建一个新类型,该类型将从您需要的集合类型继承。这里有2种方法。让我们来看看它们。
0)最简洁的解决方案将是相邻答案中提出的解决方案:
您只需创建一个类,该类继承自您需要的类型的工作表,您可以在其中以您需要的方式覆盖 ToString()。如您所知,这种结构的工作方式与普通工作表相同:
但是,现在,如果你调用,比如说,
Console.WriteLine
当一个对象被传递给它时,它会自动调用 ToString() ,你会得到:1) 仅当您将 List 用作集合时,上一个选项才适合您。但是,在您的第二个示例中,很明显您也在为自己的目的使用数组。因此,在解决您的问题时,从通用接口继承将帮助我们
IEnumerable<T>
:可以使用 访问元素
Linq
,也可以添加自己的索引器。这个类实现了一个隐式转换,所以你可以这样做:或者像这样:
但是,结果仍然是相同的:
既然我们继承自
IEnumerable<Place>
,那么你可以得到一个枚举器:为您选择最方便的方法,祝您决策顺利)