创建通用方法

时间:2017-05-19 06:12:09

标签: c# generics

我在这里想要实现一些方法,将一个接口引用列表转换为它们各自的类类型,然后返回列表在某种意义上是唯一的。

这是

    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 
    }

有没有任何方法可以用通用的方式编写这段代码。我必须用相同的模式编写一堆方法,所以我认为通用代码将是最好的选择。

请帮忙

2 个答案:

答案 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();