簡體   English   中英

根據條件將對象列表過濾到另一個列表中的更快方法

[英]Faster way to filter a list of objects in to another list based on a condition

我有一個列表(ios聯系人),我需要根據匹配字符串開頭的名字,姓氏和電子郵件進行過濾。 我有大約5000個聯系人,目前大約需要2秒鍾來過濾結果。 這是我的代碼。

    var personList = people.FindAll (p => 
                        (p.LastName != null && p.LastName.IndexOf (findstr, StringComparison.OrdinalIgnoreCase) == 0) || (p.FirstName != null && p.FirstName.IndexOf (findstr, StringComparison.OrdinalIgnoreCase) == 0
                            || (p.GetEmails ().ToList ().Count > 0 && (p.GetEmails ().ToList ().FindAll (e => e.Value.IndexOf (findstr, StringComparison.OrdinalIgnoreCase) == 0).Count > 0)))

                    );

誰能建議一個更快的方法來做到這一點? 謝謝

代替FindAll ,先調用ToList然后再調用Count ,請使用:

var personList = people.Where(p => (p.LastName != null 
    &&  p.LastName.IndexOf(findstr, StringComparison.OrdinalIgnoreCase) == 0)
    || (
        p.FirstName != null && p.FirstName.IndexOf(findstr, StringComparison.OrdinalIgnoreCase) == 0
        || (p.GetEmails().Count > 0 && (p.GetEmails()
                                            .Where(e => 
                                                e.Value.IndexOf(findstr, StringComparison.OrdinalIgnoreCase) == 0).Count > 0))
             ));

使用IndexOf(..) == 0進行比較與詢問該字符串(名稱,姓氏或電子郵件)是否以給定的findstr開頭相同。 相反,如果您想知道字符串是否包含findstr使用String.ContainsIndexOf(..) != -1

為了簡化代碼,我還將這些謂詞分開:

Func<string, bool> filter = s => !String.IsNullOrWhiteSpace(s) && s.StartsWith(findstr, StringComparison.OrdinalIgnoreCase);

var personList = people.Where(p => filter(p.FistName) || filter(p.LastName) || p.GetEmails().Select(e => e.Value).Any(filter));

現在,如果您願意,可以並行進行:

var personList = people.AsParallel(). Where(p => filter(p.FistName) || filter(p.LastName) || p.GetEmails().Select(e => e.Value).Any(filter));

您可以使用:

  • Any()代替ToList().Count > 0
  • First() ,然后檢查它是否符合條件而不是IndexOf (findstr, StringComparison.OrdinalIgnoreCase) == 0

您可以在此處找到隊列的完整列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM