これが必要なものかどうかは完全にはわかりませんが、この小さなコードを使用して、指定した出力を作成できます
簡単な使い方 (アサーションあり):
var a1 = new List<string> { "A", "A", "B", "C", "D", "E", "E" };
a1.ApplyCriteria("A").Criteria.Should().Be("A");
a1.ApplyCriteria("A").Count.Should().Be(2);
a1.ApplyCriteria("E").Criteria.Should().Be("E");
a1.ApplyCriteria("E").Count.Should().Be(2);
a1.ApplyCriteria("BCD").Criteria.Should().Be("BCD");
a1.ApplyCriteria("BCD").Count.Should().Be(1);
a1.ApplyCriteria("CD").Criteria.Should().Be("CD");
a1.ApplyCriteria("CD").Count.Should().Be(1);
// not found
a1.ApplyCriteria("CDA").Criteria.Should().Be("CDA");
a1.ApplyCriteria("CDA").Count.Should().Be(0);
ApplyCriteria メソッドによって返される GroupResult クラスは次のようになります。
class GroupResult
{
public string Criteria { get; set; }
public int Count { get; set; }
}
そして、これらは実際の作業を行っている拡張メソッドです
static class Ext
{
public static GroupResult ApplyCriteria(this IEnumerable<string> source, string criteria)
{
var elements = source.ToConcatenedString();
return new GroupResult { Criteria = criteria, Count = elements.CountOcurrences(criteria) };
}
public static int CountOcurrences(this string source, string phrase)
{
return source
.Select((c, i) => source.Substring(i))
.Count(sub => sub.StartsWith(phrase));
}
public static string ToConcatenedString<TSource>(this IEnumerable<TSource> source)
{
var sb = new StringBuilder();
foreach (var value in source)
{
sb.Append(value);
}
return sb.ToString();
}
}