4

いくつかの条件を持つすべての人を見つけるために、これよりも高速な方法はありますか?

if (!String.IsNullOrEmpty(name) && !String.IsNullOrEmpty(lastname) && !String.IsNullOrEmpty(phone))
{
      List<Person> newList = List.FindAll(s => s.Name == name && s.Surname == lastname && s.Phone == phone);
}
else if (!String.IsNullOrEmpty(name) && !String.IsNullOrEmpty(lastname))
{
      List<Person> newList = List.FindAll(s => s.Name == name && s.Surname == lastname);
}

4

2 に答える 2

7

お使いのバージョンは、実行時に最速のオプションである可能性があります。作成したList<T>.FindAll述語は、実行するチェックが最も少ないため、効率的です。

ただし、LINQ を使用して、コードをよりシンプルで保守しやすくすることができます。

IEnumerable<Person> people = List; // Start with no filters

// Add filters - just chaining as needed
if (!string.IsNullOrWhitespace(name) && !string.IsNullOrWhitespace(lastname))
{
    people = people.Where(s => s.Name == name && s.Surname == lastname);
    if (!string.IsNullOrWhitespace(phone))
        people = people.Where(s => s.Phone == phone);
}

//... Add as many as you want

List<Person> newList = people.ToList(); // Evaluate at the end

通常、フィルタリングはタイトなループで行われないため、これははるかに保守しやすく、「十分に高速」である可能性があります。

于 2013-07-09T16:32:38.687 に答える
3

読みやすくするために、このように書き直します。

if (!String.IsNullOrEmpty(name) && !String.IsNullOrEmpty(lastname)) {
     if (!String.IsNullOrEmpty(phone))
     {
           List<Person> newList = List.FindAll(s => s.Name == name && s.Surname == lastname && s.Phone == phone);
     }
     else 
     {
          List<Person> newList = List.FindAll(s => s.Name == name && s.Surname == lastname);
     }
}
于 2013-07-09T16:32:46.340 に答える