18

私は2つのクラスを持っています。1 つ目はPersonで、2 つ目はStudent (Person から継承) です。一般的なListをフィルタリングして、学年が7 よりも高いすべてのStudentを検索したいと考えています。私は次の解決策を思いつきました:

class Person
{
    public string Name {get; set;}
}

class Student : Person
{
    public decimal Grade {get; set;}
}

class Program
{
    static void Main(string[] args)
    {
        List<Person> people = new List<Person>();
        people.Add(new Person() {Name="John"});
        people.Add(new Student() {Name="Joe", Grade=6});
        people.Add(new Student() {Name="Jane", Grade=8});

        people.Where(delegate (Person person) {
            var student = person as Student;
            return student != null && student.Grade > 7;
        });
    }
}

このリストをフィルタリングする簡単な方法はありますか?

4

3 に答える 3

33

私が見る唯一の改善はOfType、このように使用することです

var result = people.OfType<Student>().Where(s => s.Grade > 7);

...そして、私の構文はより単純です...しかし、それは見る人の目にあります。

于 2013-06-22T22:35:15.157 に答える
4

いくつかの相対的なパフォーマンス数値を使用して、いくつかの異なる方法を次に示します。

イニシャル

people.Where(delegate(Person person)
{
    var student = person as Student;
    return student != null && student.Grade > 7m;
});

イニシャル モディファイド (イニシャルと同じ速度)

people.Where(p =>
{
    var student = p as Student;
    return student != null && student.Grade > 7m;
});

OfType (初期より 40 ~ 52% 遅い)

people.OfType<Student>().Where(s => s.Grade > 7m)

Foreach (初期より 9 ~ 16% 高速)

var results = new List<Student>();
foreach (var person in people)
{
    var student = person as Student;
    if (student != null && student.Grade > 7m)
    {
         results.Add(student);
    }
}

For (初期より 12-18% 速い)

var results = new List<Student>();
for (var idxPerson = 0; idxPerson < people.Count; idxPerson++)
{
    var student = people[idxPerson] as Student;
    if (student != null && student.Grade > 7m)
    {
        results.Add(student);
    }
}

パフォーマンス数値を取得するには、次のようにします。

  • 何もしなかったコントロールテストを実行しました
  • 10 ~ 1,000,000 個の要素を持つリストで各関数の時間を 100 回測定
  • 各テスト時間から制御時間を差し引いた (結果をより正確にするため)
  • 各関数は同じランダム データ セットを使用し、ToList を使用して列挙子を強制的に実行しました。

もちろん、これらは私のマシンでのパフォーマンスの数値にすぎません。実際の結果を得るには、実際のデータでテストする必要があります。生徒対人の分布、生徒の平均成績などにより、多くのタイミングの変動。

于 2014-06-04T15:09:51.440 に答える