在集合中搜索特定的字符串标记

时间:2014-10-03 12:58:40

标签: c#

我已经获得了具有以下结构的Setting个对象列表:

 public class Setting
 {
      int SettingID;
      string UserIDList;
 }

UserIDList属性将用户ID列表存储为逗号分隔值,例如" 32,45,22,53",其中用户ID可以存在于多个对象中。现在假设我想在整个集合中搜索包含特定用户ID的任何对象(例如,#34; 45"),最有效的方法是什么?

我简单地考虑在列表上进行迭代,拆分UserIDList然后在那里进行比较,但这对我来说似乎效率低下。我觉得可能有更好的方法来做到这一点。 不幸的是,改变对象的结构是不可能的。你觉得怎么样?

3 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

您可以使用Linq:

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

答案 2 :(得分: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,%')