如何为列表列表覆盖ToString方法

时间:2019-05-16 18:44:11

标签: c# .net

我对C#还是很陌生,我只能参加一次大学练习。我必须对一些元素进行排序,并通过重写方法ToString将它们显示出来。那里是覆盖问题。 List与ToString一起使用,而List与List无关。

直到现在,我都尝试创建一些简单的foreach并将其放入重写的方法中,但仍然没有成功。它只能通过方法运行。问我的教授,他告诉我,这是因为我要访问List,而不是Lista1之类的东西。就像我说的,我是新手。

using System;
using System.Collections.Generic;

namespace lista_7
{
    class Lista
    {
        public static Random rand = new Random();
        public List<int> nums = new List<int> ();

        public Lista(int n)
        {
            for (int i = 0; i <= n; i++)
            {
                nums.Add(rand.Next(100));
            }
        }

        public Lista()
        {
            Random rand = new Random();
            for (int i = 0; i <= rand.Next(5); i++)
            {
                nums.Add(rand.Next(100));
            }
        }

        public override string ToString()
        {
            String result = "";
            foreach (var numbers in nums)
            {
                result += numbers + " ";
            }

            return result;
        }
    }

    class Lista1 : Lista, IComparable<Lista1>
    {
        public Lista1(int n) : base(n) { }
        public Lista1() : base() { }
        public int CompareTo(Lista1 x)
        {
            if (x == this) return 0;
            else if (x == null) return 1;

            for (int i = 0; i < this.nums.Count && i < x.nums.Count; i++)
            {
                if (this.nums[i] > x.nums[i]) return 1;
                else if (this.nums[i] < x.nums[i]) return -1;
            }

            return x.nums.Count > this.nums.Count ? -1 : 1;
        }
    }

    class Program
    {

        static void Main(string[] args)
        {
            List<Lista1> fir = new List<Lista1> { 
              new Lista1(5), 
              new Lista1(), 
              new Lista1(3) 
            };

            foreach (var variable in fir)
            {
                //Console.Write ( toString )
                foreach (var x in variable.nums)
                {
                    Console.Write(x + " ");
                }
                Console.WriteLine();
            }

            Console.WriteLine(fir.ToString());

            Console.ReadLine();
        }
    }
}

我会描述错误,但是我没有任何错误。 fir.ToString显示System.Collections.Generic.List`1 [lista_7.Lista1]

2 个答案:

答案 0 :(得分:1)

fir.ToString()放入循环中作为variable.ToString()

foreach (var variable in fir)
{
    Console.WriteLine(variable.ToString());
}

我不确定重写ToString()方法是不是一个好主意,我宁愿为此创建一个扩展方法,但这是关于它应如何工作的。

答案 1 :(得分:0)

从评论中,他要求您从列表继承并覆盖其ToString()方法,然后从该列表的列表继承并覆盖其ToString()方法。

首先,内部列表(由于缺乏更好的用语):

public class InnerList : List<int>
{
    public override string ToString()
    {
        // return the contents of the list somehow formatted as strings.
        return string.Join(" ", this);
    }
}

接下来,是该列表的列表

public class OuterList : List<InnerList>
{
    public override string ToString()
    {
        var result = new StringBuilder();
        ForEach(inner =>
        {
            if (inner != null) result.AppendLine(inner.ToString());
        });
        return result.ToString();
    }
}

外部列表的ToString()方法通过调用其中包含的所有列表的ToString()方法来工作。

我显然正在弥补覆盖方法中的问题。但是,这是根据您指定的要求覆盖它们的方式。在“现实生活”中,这没有任何意义。我们可以声明一个List<List<int>>而不创建任何新类,然后编写代码以将其呈现为字符串。我们可以编写代码以两种不同的方式呈现相同的List<List<int>>。如果我们通过覆盖ToString()来做到这一点,则表明我们将创建不同的继承类来以不同的格式设置数字。

(有些课程倾向于过分强调继承。它很有用,但看起来好像是对所有问题的解答。)

请注意,也不需要任何一个列表来填充自身。这只会使它更加混乱。您可以编写单独的代码以向其添加数字。