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检索原始对象.但肯定有更优雅的方式来完成所有这些?这是使用接口的正确方法吗?这似乎是一个简单的想法 - 传入并获取自定义数据 - 但结果却变得如此复杂.
您是否考虑过使用元组来完成这项工作 - 有时这是关联两个类而无需创建全新类的有用方法。您可以创建元组列表:
List<Tuple<Point, Stop>>
其中 Point 是您聚集的事物。