传入并返回自定义数据 - 接口是否正确?

Chr*_*ais 5 c# generics interface

我正在C#库中编写代码来对(二维)数据集进行聚类 - 实际上是将数据分成组或集群.为了有用,库需要接收"通用"或"自定义"数据,对其进行聚类并返回聚簇数据.

为此,我需要假设传入的数据集中的每个数据都有一个与之关联的2D向量(在我的例子中Lat,Lng- 我正在使用坐标).

我的第一个想法是使用泛型类型,并传入两个列表,一个通用数据列表(即List<T>)和另一个指定2D向量的相同长度(即List<Coordinate>,Coordinate我的类用于指定lat,lng对),其中列表通过索引彼此对应.但这是相当繁琐的,因为这意味着在算法中我必须以某种方式跟踪这些指数.

我的下一个想法是使用界面,我定义一个界面

public interface IPoint
{
    double Lat { get; set; }
    double Lng { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

并确保我传入的数据实现了这个接口(即我可以假设传入的每个数据都有a Lat和a Lng).

但这对我来说也不是很有效.我正在使用我的C#库来集中传输网络中的停靠点(在不同的项目中).该类被调用Stop,并且该类也来自外部库,因此我无法实现该类的接口.

我所做的就是从中继承Stop,创建一个名为ClusterableStopthis的类:

public class ClusterableStop : GTFS.Entities.Stop, IPoint
{        

    public ClusterableStop(Stop stop)
    {
        Id = stop.Id;
        Code = stop.Code;
        Name = stop.Name;
        Description = stop.Description;
        Latitude = stop.Latitude;
        Longitude = stop.Longitude;
        Zone = stop.Zone;
        Url = stop.Url;
        LocationType = stop.LocationType;
        ParentStation = stop.ParentStation;
        Timezone = stop.Timezone;
        WheelchairBoarding = stop.WheelchairBoarding;
    }
    public double Lat
    {
        get
        {
            return this.Latitude;
        }
    }

    public double Lng
    {
        get
        {
            return this.Longitude;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

你可以看到它实现了IPoint接口.现在我使用构造函数ClusterableStop首先将Stop数据集中的所有s 转换为ClusterableStops,然后运行算法并将结果作为ClusterableStops.

这不是我真正想要的,因为我想Stop根据它们所处的集群来做事.我不能这样做,因为我实际上已经实例化了新的停止,即ClusterableStops !!

我仍然可以实现我想要的东西,因为我可以通过Id检索原始对象.但肯定有更优雅的方式来完成所有这些?这是使用接口的正确方法吗?这似乎是一个简单的想法 - 传入并获取自定义数据 - 但结果却变得如此复杂.

Iva*_*van 2

您是否考虑过使用元组来完成这项工作 - 有时这是关联两个类而无需创建全新类的有用方法。您可以创建元组列表:

List<Tuple<Point, Stop>>

其中 Point 是您聚集的事物。