我有一个或多个前缀(起始字母)和预定义前缀列表。 我想计算附加到给定单词的前缀数。 我的代码:
user.user1 = pass,write:* // write = write+read
user.user2 = pass,write:/some/folder1
user.user3 = pass,write:/some/folder2,read:/some/folder3
输出:1
它应该返回“2”作为“auto”,“dis”是前缀。
答案 0 :(得分:3)
你应该使用IndexOf而不是开头,因为你要在字符串中找到2个单词,而你的字符串只能以一个单词开头。
此外,在进行比较时使用ignoreCase
来放弃与小写和大写比较相关的问题。
public static int PrefixesCount(string word, List<string> prefixes)
{
return (from t in prefixes where word.IndexOf(t,
StringComparison.CurrentCultureIgnoreCase) >-1 select t).Count();
}
答案 1 :(得分:1)
我会选择一个简单的while循环,因为它更直观,读取和解释更好。
只要找到前缀,循环就会继续,如果找到了,它会从单词中删除它。
public static int PrefixesCount(string word, List<string> prefixes)
{
string prefix;
int count = 0;
while ((prefix = prefixes.FirstOrDefault(p => word.StartsWith(p,StringComparison.InvariantCultureIgnoreCase))) != null)
{
word = word.Substring(prefix.Length);
count++;
}
return count;
}
答案 2 :(得分:0)
为此,你必须递归。例如:
using System.Linq;
private int CntPref(List<string> prefs, string aword) {
int cnt = 0;
prefs.Select((s)=>{
if(aword.StartsWith(s)) {
cnt++;
cnt+=CntPrefs(prefs, aword.Substring(s.Length));
}
});
return cnt,
}
答案 3 :(得分:0)
你可以使用它,我解决了 Lambda 和 Linq 而不使用 StringComparison 。 您可以在扩展方法中编写一个包含控件的扩展方法,然后使用 StringComparison 获得忽略大小写敏感性。和Case insensitive 'Contains(string)'一样检查@JaredPar的答案。
public static int PrefixesCount(string word, List<string> prefixes)
{
var prefixCountWithLinq = from p in prefixes
where word.ToLower().Contains(p)
select(p).ToList();
var prefixCountWithlamda = prefixes.Count(x => word.ToLower().Contains(x));
return prefixCountWithLinq.Count();
}
返回:2
希望对你有所帮助。