我在这里想要实现一些方法,将一个接口引用列表转换为它们各自的类类型,然后返回列表在某种意义上是唯一的。
这是
public bool IsFilesHavingUniqueID(List<IFile> files)
{
List<File> _files = files.ConvertAll(x => (File)x).ToList();
return _files.Distinct().ToList().Count == _files.Count;
}
public bool IsTablesHavingUniqueID(List<ITable> tables)
{
List<Table> _tables = tables.ConvertAll(x => (Table)x).ToList();
return _tables.Distinct().ToList().Count == tables.Count;
}
调用这些方法
public bool ValidateDIPObject(DIP dip)
{
// Validating Tabels
IsFilesHavingUniqueID(dip.Files);
// Validating Files
IsTablesHavingUniqueID(dip.Tables);
// ... continues
}
有没有任何方法可以用通用的方式编写这段代码。我必须用相同的模式编写一堆方法,所以我认为通用代码将是最好的选择。
请帮忙
答案 0 :(得分:2)
你可以这样做:
public bool IsUnique<IView,T>(List<IView> ls) where T : class
{
return ls.Cast<T>().Distinct().Count()==ls.Count();
}
答案 1 :(得分:0)
您可以简单地将类型和接口指定为通用参数:
public bool IsTablesHavingUniqueID<TInterface, T>(List<TInterface> tables)
where T:TInterface
{
List<T> _tables = tables.ConvertAll(x => (T)x).ToList();
return _tables.Distinct().ToList().Count == tables.Count;
}
此代码假定类正确实现IEquatable<T>
,GetHashCode
和
Equals
,如果不是,请使用带有比较器的Distinct
的其他替代。
请注意,代码看起来像OfType的部分错误实现,可能代码可以重写为:
tables.OfType<File>().Distinct().Count() == tables.Count();