我已经获得了具有以下结构的Setting
个对象列表:
public class Setting
{
int SettingID;
string UserIDList;
}
UserIDList
属性将用户ID列表存储为逗号分隔值,例如" 32,45,22,53",其中用户ID可以存在于多个对象中。现在假设我想在整个集合中搜索包含特定用户ID的任何对象(例如,#34; 45"),最有效的方法是什么?
我简单地考虑在列表上进行迭代,拆分UserIDList
然后在那里进行比较,但这对我来说似乎效率低下。我觉得可能有更好的方法来做到这一点。 不幸的是,改变对象的结构是不可能的。你觉得怎么样?
答案 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,%')