【问题标题】:C# Sort Coordinate Points ascendingC# 对坐标点进行升序排序
【发布时间】:2021-08-30 11:03:03
【问题描述】:

我得到了这个 C# 代码来生成 10 个随机坐标点。代码生成一个包含 10 个坐标的 ArrayList,打印对象,对它们进行排序,然后再次打印它们:

using System;
using System.Collections;

namespace Point
{
    class Program
    {

        public class Point
        {
            public int x;
            public int y;

            public Point(int X, int Y)
            {
                x = X;
                y = Y;
            }
            
            override public string ToString()
            {
                return y + "." + x;
            }
            
        }

        public static void PrintValues(IEnumerable myList)
        {
            foreach (Object obj in myList)
                Console.WriteLine("{0}", obj);
            Console.WriteLine();
        }

        static void Main(string[] args)
        {
  
            ArrayList AL = new ArrayList();
            Random R = new Random();
            for(int i = 0; i< 10; i ++)
            {
                Point p = new Point(R.Next(50), R.Next(50));
                AL.Add(p);
            }
            PrintValues(AL);
            AL.Sort();
            PrintValues(AL);

        }
    }
}

我的问题:

  1. 为什么即使我不使用p.ToString(),也会自动调用Point类中的ToString()方法?

  2. 在这种情况下如何比较积分?我需要将类型更改为 int 或 double 吗?

【问题讨论】:

  • ArrayList 仍然存在只是为了向后兼容 2005 年 .Net 2 引入的泛型之前的代码,旧项目设置列表 Visual Studio,以及与 PowerShell 集合的兼容性。不要在那些非常特殊的场景之外使用 ArrayList。

标签: c# arraylist


【解决方案1】:

对于问题 #1,请查看documentation for Console.WriteLine()。有几个重载,但与调用函数的方式相匹配的重载需要一个字符串和一个对象。该重载知道在传递的对象上使用ToString() 方法。你可以像这样进一步简化这条线,它会做同样的事情:

Console.WriteLine(obj);

如果您没有为Point 类提供ToString() 方法,它将使用从基Object 类型继承的方法,默认情况下将打印类型名称。


对于问题 #2,我们再次look to the documentation。我提供的链接描述了 .Net 将用于查找合适的 Comparer 实例的过程,该实例可用于对集合中的项目进行排序。

请注意,如果您密切关注此文档,并且 ArrayList.Sort() 的文档一直到适当的 Array.Sort() 重载,我们会发现没有合适的比较器可用,这会导致此代码失败。我怀疑以某种方式推断出默认比较器,可能是ToString() 重载的string 结果。


希望您在这个答案中发现了一个主题,那就是阅读文档。即使像我这样的长期 C# 用户也需要不断地回顾。

最后,我可能会编写这样的代码来使用 .Net 中已经包含的通用列表和 Point 类型。

using System;
using System.Drawing;
using System.Collections.Generic;
using System.Linq;

namespace Point
{
    class Program
    {
        public static void PrintValues(IEnumerable myList)
        {
            foreach (Object obj in myList)
                Console.WriteLine(obj);
            Console.WriteLine();
        }

        private static Random R = new Random();
        static void Main(string[] args)
        {  
            var points = new List<Point>();
            for(int i = 0; i< 10; i ++)
            {
                poinst.Add( new Point(R.Next(50), R.Next(50)));
            }

            PrintValues(points);
            PrintValues(points.OrderBy(p => p.ToString()));
        }
    }
}

【讨论】:

  • 非常感谢,对我帮助很大。我也尝试使用文档,但找不到正确的路径。您的链接帮助了我。
猜你喜欢
  • 1970-01-01
  • 2012-07-22
  • 2011-11-05
  • 1970-01-01
  • 2018-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多