10
public HashSet<Student> GetStudents(int studentId)
{
    IEnumerable<Student> studentTypes = this.studentTypes .Where(x => (x.studentID== studentId));
    if (studentTypes .FirstOrDefault() != null)
    {

        //return new HashSet<Student>(studentTypes);
        return studentTypes.ToHashSet();
    }
    else
    {
        return new HashSet<Student>();
    }
}

public static class LinqUtilities
{
    public static HashSet<T> ToHashSet<T>(this IEnumerable<T> enumerable)
    {
        HashSet<T> hashSet = new HashSet<T>();

        foreach (var en in enumerable)
        {
            hashSet.Add(en);
        }

        return hashSet;
    }
}

这个函数被调用了很多次,比如 1000 次,结果集中有 5000 名学生。如何优化此功能...我知道从IEnumerableto的转换HashSet会导致大量开销。 ToHashSet是我的扩展方法。这个功能是为了减慢和吃很多时间。

4

2 回答 2

10

首先,您不需要在实用程序函数中枚举 hashset 值,您可以通过使用 @Jon 编写的漂亮静态扩展类来提高效率

将 linq 结果转换为哈希集

而且我认为您不需要检查 FirstOrDefault 因为扩展将处理给定 T 的新学生对象,因此您可以更改为更干净整洁的方式。

IEnumerable<Student> studentTypes = this.studentTypes.Where(x => (x.studentID== studentId));
return studentTypes.toHashSet();

另一个选项是您可以将 IEnumerable 传递给 HashSet 的构造函数,例如

HashSet<Student> studentTypes = new HashSet<Student>(this.studentTypes.Where(x => (x.studentID== studentId)));

所以你的 GetStudents 函数中只有一行代码

于 2012-06-28T14:11:18.293 回答
4

不要每次调用两次运行查询。

 //sets up a deferred query.  This query will be "executed" when enumerated.
IEnumerable<Student> studentTypes = this.studentTypes
  .Where(x => (x.studentID== studentId));

 //enumeration #1 (stops on first hit)
if (studentTypes .FirstOrDefault() != null)
{
   //enumeration #2
   return studentTypes.ToHashSet(); 

你的条件是不必要的:

 //sets up a deferred query.  This query will be "executed" when enumerated.
IEnumerable<Student> studentTypes = this.studentTypes
  .Where(x => (x.studentID== studentId));

 //enumeration #1
 return studentTypes.ToHashSet(); 

我知道从 Ienumerable 到 Hasset 的转换会导致很多开销

那是牛。你没有测量任何东西,并且误导自己优化代码的错误部分。

于 2012-06-28T15:12:23.737 回答