计算对象中字符串中的多个特定匹配项

时间:2017-06-27 09:35:26

标签: c# .net regex linq lambda

class SampleClass
{
public string Name {get; set;}
}

我有一个Sample类元素列表 -

var sampleClass = new SampleClass(Name = "HelloStackOverflow");
var sampleClass1 = new SampleClass(Name = "HelloStackOverflow");
var sampleClassWithDigit = new SampleClass(Name = "HelloStackOverflow1");

var listWithString = new List<SampleClass>();
listWithString.Add(sampleClass);
listWithString.Add(sampleClass1);
listWithString.Add(sampleClassWithDigit);

其中2个元素包含完全相同的短语 - &#34; HelloStackOverflow&#34;

最后一个有相同的短语,但它的结尾带有数字 - &#34; HelloStackOverflow1&#34;

我希望能够计算单词HelloStackOverflow和同一个单词但在末尾有数字的次数列在列表中的次数

var countNumber = listWithString.Where(x => x.Name.Contains("HelloStackOverflow")).Count();

上面的Lambda只获得与Coitans()中的模式完全匹配的前2个元素。 是否可能再次使用一些Lambda或一些表达式来匹配具有相同名称的元素/如前两个,但每次都以数字结尾并获得它们的Count() - HelloStackOverflow和HelloStackOverflow中有多少个元素HelloStackOverflow1?

2 个答案:

答案 0 :(得分:0)

如果您尝试获取2个单独的计数器,一个计算包含HelloStackOverflow的实例数,然后包含HelloStackOverflow后面跟一个数字的数量,则可以使用正则表达式:

var listWithString = new List<string> {"HelloStackOverflow", "HelloStackOverflow", "HelloStackOverflow9"};
var justTextCount = listWithString.Count(x => x.Contains("HelloStackOverflow"));
var textWithNumberCount = listWithString.Count(x => Regex.IsMatch(x, @"HelloStackOverflow\d+"));

答案 1 :(得分:0)

  

HelloStackOverflow和HelloStackOverflow9有多少元素

如果我正确理解了您的问题,那么您可以使用GroupBy获取每个项目的出现次数:

Dictionary<string, int> occurences = listWithString
            .GroupBy(item => item)
            .ToDictionary(grouping => grouping.Key, grouping => grouping.Count());

您将获得一个字典,其中列表项作为键,并且出现的次数为值,因此在您的示例中它将是:

HelloStackOverflow -> 2
HelloStackOverflow9 -> 1