我正在从配置文件读取逗号分隔的字符串列表。我需要检查另一个字符串是否在该列表中。例如:
"苹果,香蕉,奶酪"
如果我检查"苹果"
,我应该能够找到它,但如果我检查"app"
,我不应该找到。
最简单明了的方法是什么?速度并不重要。
(我会将我的解决方案添加为答案,但我希望有更好的方法。)
listString.Split(',').Contains("apple")
不使用 LINQ:
Array.IndexOf(listString.Split(','), "apple") >= 0
(","+listString+",").Contains(","+testWord+",");
但并不是直接的。
正则表达式可能不算“直截了当”,但这是我得到的:
Regex.IsMatch(listString, "(?<=,|^)" + testWord + "(?=,|$)")
更新: 根据Eric在下面的评论中提到的,应该是这样的:
Regex.IsMatch(listString, "(?<=,|^)" + Regex.Escape(testWord) + "(?=,|$)")
另一种方法可能是尝试使用
bool contains = new List<string>("apple,banana,cheese".Split(',')).Contains("apple");
//or
bool b = "apple,banana,cheese".Split(',').Contains("apple");
这个方法可行,但如果正则表达式变得复杂,它会变得非常慢。话虽如此,单词边界锚点使这种操作变得相当容易。
var foods = "apple,banana,cheese";
var match = Regex.Match(foods, @"\bapple\b");
if (match.Success)
Console.WriteLine(match.Value);
这里有一个忽略大小写的选项。
var food = "apple,banana,cheese";
bool containsApp = food.Split(',')
.Where(s => string.Compare("app", s, true) == 0)
.Count() > 0;
bool containsApple = food.Split(',')
.Where(s => string.Compare("apple", s, true) == 0)
.Count() > 0;
Console.WriteLine("Contains \"app\"? {0}", containsApp);
Console.WriteLine("Contains \"apple\"? {0}", containsApple);
IEnumerable<T>.Compare
有一个重载,它接受一个IEqualityComparer<T>
。 - Lee答案取决于逗号分隔列表的语法规则。
如果规则要求列表与您发布的完全相同(没有空格,没有尾随逗号),那么任务可以分解为其组成部分:
字符串是否以apple,
开头?(String.StartsWith)
字符串是否以,apple
结尾?(String.EndsWith)
字符串是否包含,apple,
?(String.Contains)
如果规则更加复杂,则正则表达式方法成为唯一的方式,而不必完全处理列表或编写大量规则。
如果您正在针对同一字符串检查多个项目,则应将字符串转换为缓存的列表,然后进行检查。 String.Split方法将为您执行此操作。
public bool GetIsExistSubstring(string mainstring, string substring)
{
bool Isexist=false;
int i = -1;
mainstring = string.Format(",{0},", mainstring);//so it will be like ,1,2,3,
substring = string.Format(",{0},", substring);//so it will be like ,1,
i=mainstring.IndexOf(substring);
if(i!=-1)
{
Isexist = true;
}
return Isexist;
}
这是忽略大小写和文化的解决方案(或选择StringComparer
属性之一)
var commaDelimitedString = "string1,string2,string3,string4";
var testString = string2.trim; // trim to remove the spaces coz you may be getting it from UI
if(commaDelimitedString.split(',').contains(testString,StringComparer.InvariantCultureIgnoreCase))
{
//TODO: What to do when condition is true
}
else
{
//TODO: What to do when condition is false
}
Contains
LINQ 扩展方法可以用于数组。但如果你使用的是 .Net 1.1 或 2.0,则无法使用该方法。 - Ryan AlfordArray.IndexOf(listString.Split(','), "apple") >= 0
。 - Fábio Batista