泛型方法问题

本文关键字:问题 泛型方法 | 更新日期: 2023-09-27 18:08:54

我正在尝试实现一个LINQ-to-SQL扩展方法,它将简单地获得一个随机行。这是我的代码:

public static T RandomRow(this IQueryable<T> query)
{
    Random rand = new Random();
    int row = rand.Next(0, query.Count());
    return query.Skip(row).First();
}

问题是,query.Count()和query.Skip()有一个错误'方法的类型参数'…'不能从用法中推断出来。尝试显式指定类型参数。如果我将T修改为特定对象的,它会工作得很好,但是对于任何数据库对象使用此方法都很棒。

任何想法?

泛型方法问题

你的方法看起来应该是通用的:

// Note the <T> after the method name
public static T RandomRow<T>(this IQueryable<T> query)

要么这样,要么把它放在一个泛型类中。

您可能还想使用ElementAt方法而不是Skip/First

编辑:正如CodeInChaos所指出的,你使用Random也是有问题的。

您还有另一个问题:您在每次调用此方法时创建Random的新实例。这意味着如果您快速连续调用它,将得到相同的结果,这会破坏封装。

有几种方法可以避免这个问题:

  1. 传入Random实例,并让调用代码管理其生命周期
  2. 使用包含Random实例的静态字段。您需要通过使用锁或使用线程静态字段
  3. 来照顾线程安全。
  4. 设置为实例方法,并设置Random为实例字段。
  5. 使用比默认种子更好的手动播种。