当前位置: 首页 > 知识库问答 >
问题:

C#添加其他方法到列表?[副本]

钱远
2023-03-14

我有Point2D类作为基类,为了存储点列表,我通常使用List ,但现在我想在List 中添加额外的方法和一些属性,比如用于打印的ToString方法,基于特定坐标的排序,用于筛选点的特定方法,我不想使用扩展方法。

我创建了一个新的point2dlist类,它继承了list 类,它在正常情况下工作很好,但是当使用FindAll函数时,它现在返回list 但我希望它返回point2dlist。我知道我可以编写自己的方法来接受谓词委托,但这是太多的工作了。

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

namespace ConsoleAppTest
{
    internal static class Program
    {
        private static void Main()
        {
            try
            {
                var points = new Point2DList();
                points.Add(new Point2D(0, 0));
                points.Add(new Point2D(10, 0));
                points.Add(new Point2D(10, 10));
                points.Add(new Point2D(0, 10));
                Console.WriteLine(points.ToString());
                Point2DList newPoints = points.FindAll((x) => x.X == 10);
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                Console.ReadLine();
            }
        }
    }

    public class Point2DList : List<Point2D>
    {
        public override string ToString()
        {
            var sb = new StringBuilder();
            sb.AppendLine("List of Points");
            foreach (var pt in this)
            {
                sb.AppendLine(pt.ToString());
            }
            return sb.Remove(sb.Length - 1, 1).ToString();
        }
    }

    public class Point2D
    {
        public int X { get; set; }
        public int Y { get; set; }

        public Point2D(int x, int y)
        {
            X = x;
            Y = y;
        }

        public override string ToString()
        {
            return $"{X},{Y}";
        }
    }
}

共有1个答案

江亮
2023-03-14

很少需要从任何集合类型继承,特别是当你只想扩展它,而不是改变它的实现时。因此,我会选择组合而不是继承,而是使用一个字段:

class Points2DList
{
    private List<Point2D> _points;

    public Points2DList(List<Point2D> points) { _points = points; } 

    public override string ToString() { ...}

    public void Add(Point2D p { _points.Add(p); } // delegate to implementation of your underlying list

    public Point2D this[int i] // delegate to implementation of your underlying list
    { 
        get => _points[i]; 
        set => _points[i] = value; 
    }

    public Points2DList FindAll(Predicate<Point2D> P) 
    {
        return new Points2DList(_list.FindAll(p));// delegate to implementation of your underlying list
    }
}

通过这种方式,您可以控制您真正想要向客户端公开的功能。使用继承会向外部公开每个公共成员,这可能是您不想要的。例如。虽然您希望允许从列表中删除元素,但您可能不希望启用客户端对其调用clear

 类似资料:
  • 问题内容: 我需要一种快速的方法来复制表中的DATETIME列并为其赋予新的名称。 我的表中有名为myResults的列myDate,我需要查询以在表中创建一个名为newDate的新列,该列具有与myDate列完全相同的数据。 有没有比做一个明显的两步方法来做一个新列,然后复制所有数据(这是一个大表,我正在寻找最快的方法)更快的方法? 明显的解决方案: 问题答案: 不幸的是,显而易见的解决方案是唯

  • 我有下面提到的表,我想通过查询添加列,这将增加一列到表的值对其他列特定值考虑以下表 在这个表中,在1前面想要文本作为活动,在零(0)前面,我想要它作为列名状态的非活动。

  • 我有这个对象结构,像 mi jasper 报告中的 Java Bean 一样使用, 具有相应和的所有类 当我在jasper报告中创建列表时,我这样定义“作业列表”: 现在我要创建另一个列表,“职责列表”放在“工作列表”上,问题是: 我如何定义数据源以获得要传递到中的相应作业? 我想象这样的事情: 但我不能让它工作

  • ...但我得到: 我不知道如何应用这些信息。首先,我认为我需要为列表声明一些额外的映射(在同一个映射器类中),所以MapStruct知道如何像这样映射列表类型的每个字段: ...但我收到错误消息

  • 我使用文件路径解析 Spark 数据帧,但现在我想将路径与时间一起作为单独的列添加到生成的数据帧中。下面是一个当前的解决方案(pathToDF 是一个帮助器方法): 我正在尝试做这样的事情,但我不确定如何使用Column添加时间列: 实现它的更好方法是什么? 输入自由度: 当前结果: 预期结果:

  • 在我的scala程序中,我有一个dataframe,其中有两列和(类型都为)。除此之外,我有一个先前定义的对象和一些方法和属性。在这里,我想要使用dataframe的当前值和中的属性向dataframe添加一个新列。 例如,如果我有下面的dataframe: 谢谢你。