集合

2014-10-03 50 views
0

我有Setting對象具有以下結構的列表中搜索特定字符串的令牌:集合

public class Setting 
{ 
     int SettingID; 
     string UserIDList; 
} 

UserIDList屬性存儲用戶ID列表作爲逗號分隔值,例如「32,45,22,53」,其中用戶ID可以存在於多個對象中。現在假設我想搜索包含特定用戶ID(例如「45」)的任何對象的整個集合,那麼執行此操作的最有效方法是什麼?

我簡要地考慮遍歷列表,分裂UserIDList,然後做比較,在那裏,但是這似乎沒有效率的我。我覺得可能有更好的方法來做到這一點。 不幸的是,改變對象的結構不存在問題。你怎麼看?

+2

在哪種情況下高效/低效?桌面計算機上有1000個項目,用戶從UI中觸發一次操作,其中數據來自非本地數據庫?寫什麼更可讀的(見解答)和容易... – 2014-10-03 13:01:18

+0

我建議改變'Setting'到'UserIDList'存儲爲'名單'如果可能的話。 – juharr 2014-10-03 13:01:37

+1

用戶正則表達式 – RAJ 2014-10-03 13:03:05

回答

0

你可以使用LINQ做到這一點:

var result = from setting in settingList 
      where setting.UserIdList.Split(',').Contains("45") 
      select setting; 
+0

「Contains」方法作用於列表而不是字符串。 List.Contains(「45」)測試列表中的某個元素是否等於「45」。因此,如果字符串包含「457」,則不會被採用。 – Thibaut91170 2014-10-03 13:29:29

0
settingList.Where(s => s.UserIDList == "45" || 
         s.UserIDList.StartsWith("45,") || //LIKE('45,%') 
         s.UserIDList.EndsWith(",45") || //LIKE('%,45') 
         s.UserIDList.Contains(",45,")) //LIKE('%,45,%') 
1

您可以用正則表達式做到這一點。

List<Setting> FindItemsInList(List<Setting> settings, string val) 
{ 
    var result = new List<Setting>(); 
    var searchRegEx = new RegEx(@"\b" + val + @"\b"); 
    foreach (var s in settings) 
    { 
     if (searchRegEx.IsMatch(s.UserIDList)) 
     { 
      result.Add(s); 
     } 
    } 
    return result; 
} 

的這裏的想法是,在正則表達式使用\b元字符只能獲得整個單詞。創建的正則表達式的格式爲「」\ b45 \ b「。

這樣可以正確處理值位於字符串開頭,字符串末尾以及中間任何位置的情況,並且不會錯誤地告訴您「457」匹配「45」。

可以縮短與LINQ。將環路替換爲:

var result = settings.Where(s => searchRegEx.IsMatch(s.UserIDList)).ToList();