C# 覆盖列表<;T>;。ToString()

C# 覆盖列表<;T>;。ToString(),c#,C#,好的,我已经在学习阶段了,进行搜索,不进行查找,我想从列表中返回.ToString(),但这在使用中 using System.Collections.Generic; using System.Text; namespace eciv { using Pontos = List<Ponto>; // I need override ToString() public partial class FPrincipal : Form { pr

好的,我已经在学习阶段了,进行搜索,不进行查找,我想从列表中返回.ToString(),但这在使用中

using System.Collections.Generic; 
using System.Text;

namespace eciv {
    using Pontos = List<Ponto>;  // I need override ToString()

    public partial class FPrincipal : Form  {

        private void button1_Click(object sender, EventArgs e)  {
            Pontos aa = new Pontos();
            aa.Add(new Ponto(2, 3));
            aa.Add(new Ponto(3, 4));
            textBox1.Text = aa.ToString();  // here I need help  
        }
    }

    public class Ponto {

        public double X;
        public double Y;

        public Ponto() {}

        public Ponto(double x, double y) { 
            this.X = x; this.Y = y; 
        }

        public Ponto(Ponto p) { 
            this.X = p.X; 
            this.Y = p.Y; 
        }

        public override string ToString() {
            string s = "(" + this.X.ToString() + "," + this.Y.ToString() + ")";
            return s;
        }
    }   
}
我想要这样的东西

((2,3),(3,4))
我想是这个,但不起作用

public override string ToString() : Pontos {  
    StringBuilder s = new StringBuilder();
    s.Append("(");

    foreach (Ponto p in this) 
    {  
        s.Append(p.ToString() + ",");
    }

    s.Replace(",", ")", s.Length - 1, 1);
    return s.ToString();
}

如果不是从某个类继承,则不能重写该类中的方法。因此,解决方案很简单-不要创建名称别名,而是创建一个继承
列表的类

如果只想将pontos列表转换为字符串一次,我会选择第二个选项——字符串格式不是引入新类型的好理由


如果需要多次将此列表转换为字符串,可以创建一些私有或扩展方法来格式化对象列表(不需要Ponto对象)。例如

公共静态字符串字符串化(此IEnumerable值)
=>$”({String.Join(“,”,values})”;
用法

textBox1.Text = aa.Stringify(); // works with List<int> etc
textBox1.Text=aa.Stringify();//用于列表等
链接:

  • -如果要将项目合并到一个字符串中,请不要使用StringBuilder
  • -使用新功能扩展现有类
  • -用于格式化字符串的新语法

您可以创建自己的
列表
,该列表覆盖
ToString()
-方法

public class MyList<T> : List<T>
{
    public override string ToString()
    {
        StringBuilder s = new StringBuilder();
        s.Append("(");
        foreach (var element in this)
        {
            s.Append(element.ToString() + ",");
        }
        s.Replace(",", ")", s.Length - 1, 1);
        return s.ToString();
    }
}
公共类MyList:列表
{
公共重写字符串ToString()
{
StringBuilder s=新的StringBuilder();
s、 附加(“”);
foreach(本文件中的var元素)
{
s、 追加(element.ToString()+“,”);
}
s、 替换(“,”,”),s.长度-1,1);
返回s.ToString();
}
}

您可以基于为
Ponto
类创建的
ToString()
实现创建字符串,而不是调用
List
上的
ToString()
,如下所示:

Pontos aa = new Pontos();
aa.Add(new Ponto(2, 3));
aa.Add(new Ponto(3, 4));

StringBuilder s = new StringBuilder();
s.Append("(");
s.Append(String.Join(",", aa));
s.Append(")");

textBox1.Text = s.ToString();

public override string to string():Pontos
不是c#syntax,所以当我写这些时,我想我需要重写第4行中声明的Pontos(Pontos是列表),我使用它,但首先我需要注释我的
使用Pontos=list;
要有
类Pontos
,变得更快,我有更大的多边形
public static string Stringify<T>(this IEnumerable<T> values)
   => $"({String.Join(",", values})";
textBox1.Text = aa.Stringify(); // works with List<int> etc
public class MyList<T> : List<T>
{
    public override string ToString()
    {
        StringBuilder s = new StringBuilder();
        s.Append("(");
        foreach (var element in this)
        {
            s.Append(element.ToString() + ",");
        }
        s.Replace(",", ")", s.Length - 1, 1);
        return s.ToString();
    }
}
Pontos aa = new Pontos();
aa.Add(new Ponto(2, 3));
aa.Add(new Ponto(3, 4));

StringBuilder s = new StringBuilder();
s.Append("(");
s.Append(String.Join(",", aa));
s.Append(")");

textBox1.Text = s.ToString();