【问题标题】:Generic Extension Methods C#通用扩展方法 C#
【发布时间】:2016-10-30 12:33:37
【问题描述】:

我正在创建一些我想在不同集合上使用的扩展方法,主要是那些实现 IList 和数组集合 [] 的扩展方法,每当我创建扩展方法时,我需要创建 2 而不是仅仅 1 以便它两者都适用

    public static IList<T> Shuffle<T>(this IList<T> inputCollection)
    {

    }

    public static T[] Shuffle<T>(this T[] inputCollection)
    {

    }

我的大多数方法都需要使用索引,所以我不能使用IEnumerable 是否有其他方法可以只编写 1 个扩展方法并将其用于两个所需的集合?有时我也会使用string,这是另一种方法。

【问题讨论】:

  • 如果您要返回一个新集合,那么 IEnumerable 就足够了。但你肯定不想这样做,所以 ICollection 是正确的风格。
  • 数组实现IList&lt;T&gt;,因此您可能不需要其中之一(取决于实现)。
  • 选项 1 是使用由两个数组和 List&lt;T&gt; 实现的非泛型 IList 接口,另一个选项是为实现 IList 但从底层数组读取和写入的数组创建包装器,在在数组 ext 方法中你可以new Wrapper(array).ListExtMethod()
  • @csharpfolk 你不需要包装器。 T[] 已经实现 IList&lt;T&gt;

标签: c# arrays list generics collections


【解决方案1】:

你可以试试

public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> value)

签名;并使用它

IList<T> list = Shuffle(myList).ToList();
T[] array = Shuffle(myArray).ToArray();

甚至

IList<T> list = myList.Shuffle().ToList();
T[] array = myArray.Shuffle().ToArray();

【讨论】:

  • 但是如果我使用this IEnumerable&lt;T&gt; value 我不能在我的方法中应用索引。
  • @PreqlSusSpermaOhranitel:只需将其翻译成数组:T[] data = value.ToArray();
  • 很好,解决了我的问题!
  • 这是合适的解决方案,因为 LINQ 方法不会改变原始的 IEnumerable&lt;T&gt; 实例。但是,如果您想对原始实例进行操作(在这种情况下,我不会使用扩展方法),您可以使用IList&lt;T&gt; 作为参数,因为List&lt;T&gt;T[] 都已经实现了IList&lt;T&gt;(可索引) ),并且您不必在方法内创建副本。
【解决方案2】:

我建议使用这种扩展方法,因为所有List 对象都继承自IEnumerable

public static IEnumerable<T> MethodName<T>(this IEnumerable<T> value)

【讨论】:

    猜你喜欢
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多