删除前缀词后Linq Count

时间:2017-10-18 06:25:01

标签: c# linq

我有一个或多个前缀(起始字母)和预定义前缀列表。 我想计算附加到给定单词的前缀数。 我的代码:

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”是前缀。

4 个答案:

答案 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

希望对你有所帮助。