如何将函数转换为通用模板

时间:2015-10-08 22:07:35

标签: c# generics

我有一个函数,我想使用泛型,我假设。我希望函数能够处理几乎任何类型的数组(例如int [],double [],string []等,而不是下面函数中的int []。如何修改此代码才能执行此操作?

    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(PhotoBrowserCellIdentifier, forIndexPath: indexPath) as! PhotoBrowserCollectionViewCell

    let imageURL = (photos.objectAtIndex(indexPath.row) as! PictureElement).imageURL

    cell.request?.cancel()

    // Using image cache system to make sure the table view works even when rapidly scrolling down the screen.
    if let image = self.imageCache.objectForKey(imageURL) as? UIImage {
        cell.imageView.image = image

    } else {

        cell.imageView.image = nil


        cell.request = Alamofire.request(.GET, imageURL).responseImage { response in
            debugPrint(response)

            print(response.request)
            print(response.response)
            debugPrint(response.result)

            if let image = response.result.value {

                self.imageCache.setObject(response.result.value!, forKey: response.request!.URLString)
                cell.imageView.image = image
            } else {

            }


        }
}
return cell

2 个答案:

答案 0 :(得分:1)

使用通用方法签名。按照惯例,类型说明符以T为前缀。

public static bool isHomogenous<T>(T[] list)
{
    bool result = true;
    for (int i = 0; i < list.Length; i++)
        if (!list[i].Equals(list[0]))
            result = false;
    return result;
}

请注意,如果您不使用T约束它,则会将通用类型where视为对象,因此您必须使用.Equals方法来比较这些值。

或者,只需使用LINQ:

public static bool IsHomogenousLinq<T>(IEnumerable<T> list)
{
    //handle null and empty lists however you want (throw ArgEx?, return false?)
    var firstElement = list.First();
    return list.All(element => element.Equals(firstElement));
}

Demo on .NET Fiddle

答案 1 :(得分:0)

上面的答案也有效,但这是一个较短的版本:

public static bool IsHomogenous<T>(T[] list)
{
    return !list.Distinct().Skip(1).Any();
}