C# NET中数组上的泛型函数

C# NET中数组上的泛型函数,c#,.net,arrays,C#,.net,Arrays,我经常在C#中定期使用int/float数组和其他东西,因为它们比List更快(可能?)。目前,我已经为每种类型实现了几十个函数: /// <summary> /// Checks if the array contains the given value. /// </summary> public static bool contains(int[] values, int value) { for (int s = 0, sl = values.Length

我经常在C#中定期使用int/float数组和其他东西,因为它们比List更快(可能?)。目前,我已经为每种类型实现了几十个函数:

/// <summary>
/// Checks if the array contains the given value.
/// </summary>
public static bool contains(int[] values, int value) {
    for (int s = 0, sl = values.Length; s < sl; s++) {
        if (values[s] == value) {
            return true;
        }
    }
    return false;
}
/// <summary>
/// Checks if the array contains the given value.
/// </summary>
public static bool contains(float[] values, float value) {
    for (int s = 0, sl = values.Length; s < sl; s++) {
        if (values[s] == value) {
            return true;
        }
    }
    return false;
}
//
///检查数组是否包含给定值。
/// 
公共静态bool包含(int[]值,int值){
for(int s=0,sl=values.Length;s

有没有一种方法可以以通用的方式实现这些功能?或者,只有在我使用
列表
的情况下才可以这样做?

谢谢@Servy的更正:

/// <summary>
/// Checks if the array contains the given value.
/// </summary>
public static bool Contains<T>(T[] values, T value) {
    for (int s = 0, sl = values.Length; s < sl; s++) {
        if (object.Equals(values[s].value)) {
            return true;
        }
    }
    return false;
}

感谢@Servy的更正:

/// <summary>
/// Checks if the array contains the given value.
/// </summary>
public static bool Contains<T>(T[] values, T value) {
    for (int s = 0, sl = values.Length; s < sl; s++) {
        if (object.Equals(values[s].value)) {
            return true;
        }
    }
    return false;
}

System.Array
类型有一个令人眼花缭乱的静态方法数组,可以帮助您搜索、排列、排序数组。你绝对不需要自己动手。这些静态方法(如
Find
FindAll
)也接受泛型参数。以下是借助PowerShell发布的列表:

Name                           Definition                    
----                           ----------                    
AsReadOnly                     static System.Collections.... 
BinarySearch                   static int BinarySearch(ar... 
Clear                          static void Clear(array ar... 
ConstrainedCopy                static void ConstrainedCop... 
ConvertAll                     static TOutput[] ConvertAl... 
Copy                           static void Copy(array sou... 
CreateInstance                 static array CreateInstanc... 
Equals                         static bool Equals(System.... 
Exists                         static bool Exists[T](T[] ... 
Find                           static T Find[T](T[] array... 
FindAll                        static T[] FindAll[T](T[] ... 
FindIndex                      static int FindIndex[T](T[... 
FindLast                       static T FindLast[T](T[] a... 
FindLastIndex                  static int FindLastIndex[T... 
ForEach                        static void ForEach[T](T[]... 
IndexOf                        static int IndexOf(array a... 
LastIndexOf                    static int LastIndexOf(arr... 
ReferenceEquals                static bool ReferenceEqual... 
Resize                         static void Resize[T]([ref... 
Reverse                        static void Reverse(array ... 
Sort                           static void Sort(array arr... 
TrueForAll                     static bool TrueForAll[T](... 

System.Array
类型有一个令人眼花缭乱的静态方法数组,可以帮助您搜索、排列、排序数组。你绝对不需要自己动手。这些静态方法(如
Find
FindAll
)也接受泛型参数。以下是借助PowerShell发布的列表:

Name                           Definition                    
----                           ----------                    
AsReadOnly                     static System.Collections.... 
BinarySearch                   static int BinarySearch(ar... 
Clear                          static void Clear(array ar... 
ConstrainedCopy                static void ConstrainedCop... 
ConvertAll                     static TOutput[] ConvertAl... 
Copy                           static void Copy(array sou... 
CreateInstance                 static array CreateInstanc... 
Equals                         static bool Equals(System.... 
Exists                         static bool Exists[T](T[] ... 
Find                           static T Find[T](T[] array... 
FindAll                        static T[] FindAll[T](T[] ... 
FindIndex                      static int FindIndex[T](T[... 
FindLast                       static T FindLast[T](T[] a... 
FindLastIndex                  static int FindLastIndex[T... 
ForEach                        static void ForEach[T](T[]... 
IndexOf                        static int IndexOf(array a... 
LastIndexOf                    static int LastIndexOf(arr... 
ReferenceEquals                static bool ReferenceEqual... 
Resize                         static void Resize[T]([ref... 
Reverse                        static void Reverse(array ... 
Sort                           static void Sort(array arr... 
TrueForAll                     static bool TrueForAll[T](... 


您使用的是什么版本的.NET?林克有这方面的报道。”(也许?)?你不确定吗?你真的应该首先进行测试和基准测试。你做的任何通用的测试都会比较慢。如果您关心数组和列表(非常小)之间的差异,您就不想处理泛型化的速度减慢(只比次整数稍慢)。@Servy泛型版本会以什么方式变慢?每个泛型函数都是根据它所使用的类型进行JIT的,所以它应该和非泛型版本一样快。除了jitting上的最小差异之外。@Rogerasing一般来说,您是正确的,但是在处理数字类型的特定情况下,您不能添加任何通用约束(因为数字类型的大部分功能没有接口),以公开它们的大部分功能。您将使用
object.Equals
来比较元素,或者更糟糕的是,使用
Func
来确定相等性,这将比将参数键入为
int
和使用
运算符==
要慢。您使用的是.NET的哪个版本?林克有这方面的报道。”(也许?)?你不确定吗?你真的应该首先进行测试和基准测试。你做的任何通用的测试都会比较慢。如果您关心数组和列表(非常小)之间的差异,您就不想处理泛型化的速度减慢(只比次整数稍慢)。@Servy泛型版本会以什么方式变慢?每个泛型函数都是根据它所使用的类型进行JIT的,所以它应该和非泛型版本一样快。除了jitting上的最小差异之外。@Rogerasing一般来说,您是正确的,但是在处理数字类型的特定情况下,您不能添加任何通用约束(因为数字类型的大部分功能没有接口),以公开它们的大部分功能。您将使用
object.Equals
来比较元素,或者更糟糕的是,使用
Func
来确定相等性,这将比将参数键入为
int
和使用
运算符==
要慢。这将无法很好地处理
null
对象。。。(除非添加一个
其中T:struct
)如果使用静态
对象。等于(a,b)
它会处理这个问题。@Kek添加一个
其中T:struct
通用约束!;)@Geotarget将进行参考比较,而不是值比较,因为无约束的
T
相当于
对象
@Servy,您是对的。。。这不是完美的代码,但添加where T结构似乎有点限制。我想这取决于它的名字。我会让OP定制这个code@Kek请参阅我的编辑。只需使用
object.Equals(a,b)
而不是
a.Equals(b)
,空检查将得到正确处理。这不会很好地处理
null
对象。。。(除非添加一个
其中T:struct
)如果使用静态
对象。等于(a,b)
它会处理这个问题。@Kek添加一个
其中T:struct
通用约束!;)@Geotarget将进行参考比较,而不是值比较,因为无约束的
T
相当于
对象
@Servy,您是对的。。。这不是完美的代码,但添加where T结构似乎有点限制。我想这取决于它的名字。我会让OP定制这个code@Kek请参阅我的编辑。只要使用
object.Equals(a,b)
而不是
a.Equals(b)
,空检查就会得到正确处理。你把20个函数称为一个令人眼花缭乱的数组?(如果他看到了我的收藏该怎么办!)我更关注的是“数组”的双关语,而不是方法计数;)你把20个函数称为一个令人眼花缭乱的数组?(如果他看到了我的收藏该怎么办!)我更关注的是“数组”的双关语,而不是方法计数;)