2013-02-06 30 views
0

我工作的iPhone應用程序,讓重複的電話號碼,我已經取得的代碼,但表現是如此糟糕了重複的電話號碼,並採取時候提高性能。這裏是我的代碼:在ABAddressBook

OrderedDictionary persons = new OrderedDictionary(); 
    ABAddressBook ab = new ABAddressBook(); 

    foreach (ABPerson p in ab.GetPeople()) { 

      foreach (var phoneNumber in p.GetPhones().GetValues()) { 
       var duplicates = SearchByPhoneNumber (ab, phoneNumber); 
       if (duplicates.Count > 1) { 
        if (!persons.Contains (phoneNumber)) { 
         persons.Add (phoneNumber, duplicates); 
        } 
       } 

      } 
     } 


    List<ABPerson> SearchByPhoneNumber (ABAddressBook ab, string phoneNumber) 
{ 
     List<ABPerson> duplicatepeople = new List<ABPerson>(); 
     phoneNumber = Regex.Replace (phoneNumber, "[^0-9]", ""); 


     var people = ab.Where(x=> x is ABPerson).Cast<ABPerson>().Where(x=> x.GetPhones() 
                     .Where(p=> Regex.Replace(p.Value,"[^0-9]", "")==phoneNumber || phoneNumber ==Regex.Replace(p.Value,"[^0-9]", "")).Count() > 0).ToArray(); 

     foreach(ABPerson person in people) 
     { 
      if(duplicatepeople.Intersect(person.GetRelatedNames().Cast<ABPerson>()).Count() <= 0) 
      { 
       duplicatepeople.Add(person); 
      } 

     } 

     return duplicatepeople; 
    } 

回答

0

我沒有時間檢查兩者之間的時間,但我確實注意到您正在多次迭代地址簿數字(對於每個電話號碼,您在每個.Where中重複遍歷列表)。另外我注意到你在循環中多次爲每個電話號碼執行相同的正則表達式。

這可能不完全符合您的需求,但它確實在我的地址簿中找到了重複內容,並且速度並不慢。

ABAddressBook ab = new ABAddressBook(); 

// flatten out the list of all phone numbers and perform the regEx just once for each phone number 
var processedList = new List<Tuple<string, ABPerson>>(); 
foreach (ABPerson p in ab.GetPeople()) 
{ 
    foreach (var phoneNumber in p.GetPhones().GetValues()) 
    { 
     processedList.Add(new Tuple<string, ABPerson>(Regex.Replace (phoneNumber, "[^0-9]", ""), p)); 
    } 
} 

var duplicates = (from person in processedList 
    group person by person.Item1 into g 
    where g.Count() > 1 
    select new { PhoneNumber = g.Key, Person = g }).ToList(); 

foreach (var d in duplicates) 
{ 
    Console.WriteLine("{0} {1}", d.PhoneNumber, d.Person.Count()); 
    foreach (var p in d.Person) 
    { 
     Console.WriteLine(p.Item2.FirstName); 
    } 
} 

我希望這會有所幫助。

+0

非常感謝,我實際上已經解決了..但仍然你的答案正確:) –