2012-06-28 13 views
8
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は私の拡張メソッドです。 この機能は、多くの時間を遅くして食べることです。LINQでIEnumerableからHashSetへの変換を最適化する

+0

ToHastSetの機能は何ですか? – Turbot

+0

がハッシュセットに追加されました...ハッシュセットはインターネットのコードです。 – abbas

答えて

9

まず、あなたのユーティリティは 機能では、あなたが@ジョン

Converting linq result to hashset

によって書かれた素敵な静的な拡張クラスを使用することにより、効率的に向上させることができHashSetの値を列挙する必要はありませんし、私はあなたにドンと思いますFirstOrDefaultをチェックする必要はありません.The で与えられた新しい生徒オブジェクトを拡張が処理するので、よりきれいできちんとした方法に変更することができます。他のオプションは

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

ようHashSetの のためにあなたのコンストラクタにIEnumerableをあなたに渡すことができますので、あなただけのGetStudentsに1行のコードを持っている

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

は実行しないでください

+0

しかし、これはパフォーマンスを向上させるでしょうか?大きな値に対して新しいハッシュセットを実行するbeacuseはパフォーマンスを低下させています。 – abbas

+0

ハッシュセット(T)それは高性能セット操作を自己提供します。私はあなたがパフォーマンスについて何を参照しているのか分かりませんが、最適化はLINQでの変換の列挙の重複呼び出しを避けることです。 – Turbot

4

機能します1回の呼び出しで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(); 

私はHassetへのIEnumerableからの変換は、雄牛のオーバーヘッド

多くの を引き起こしていることを知っています。あなたは何も測定しておらず、コードの間違った部分を最適化するためにあなた自身を誤解しています。

+0

あなたの最後の行は完全に真です。 OPは任意の仮定をしている。 – usr

関連する問題