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 人の生徒が含まれます。この関数を最適化するにはどうすればよいですか ... からIEnumerableへの変換HashSetが多くのオーバーヘッドを引き起こしていることはわかっています。 ToHashSet私の拡張方法です。この機能は、ゆっくりと多くの時間を食べることです。

4

2 に答える 2

10

まず、ユーティリティ関数でハッシュセット値を列挙する必要はありません。@Jon によって書かれた素敵な静的拡張クラスを使用することで効率を向上させることができます。

linq の結果をハッシュセットに変換する

拡張機能は T を指定して新しい学生オブジェクトを処理するため、FirstOrDefault をチェックする必要はないと思います。これにより、よりクリーンで整然とした方法に変更できます。

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

もう1つのオプションは、IEnumerableをHashSetのコンストラクターに渡すことができることです

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

したがって、GetStudents 関数には 1 行のコードしかありません。

于 2012-06-28T14:11:18.293 に答える
4

呼び出しごとにクエリを 2 回実行しないでください。

 //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 に答える