文字列中に特定の文字が何回出てくるか数えてみよう §
文字列中に特定の文字が何回出てくるか数えてみましょう。
そのような機能を持ったメソッドはstringクラスにはありませんが、LINQにはあります。それを使えば簡潔に書けます。サンプルソースの方法1です。
LINQを使わないとすればIndexOfメソッドを繰り返す使うことで、全ての文字を調べることになります。これがサンプルソースの方法2です。
IndexOfメソッドでは細かい条件指定ができないので、単純にループをまわしてifで判定させているのが方法3です。
方法1は簡潔だが自由度が低いと思うなら、条件判定をWhereメソッドに分離して方法4のように書き直すことで来ます。この場合は、Whereメソッドの前後にどんな処理を挟むことも自由です。
罠の数々 §
- 条件付きのCountメソッドの用法は、LengthプロパティとCountメソッドは似たようなもの……と思い込むと見落とす。
参考リンク §
Enumerable.Count メソッド
String.IndexOf メソッド
String.IndexOf メソッドは文字列専用だが、Enumerable.Count メソッドはどんな型が相手でも使用できる。上のリンクを辿って定義の違いを確認してみよう。
リポジトリ §
https://github.com/autumn009/cshowto
CountChar §
using System;
using System.Linq;
class Program
{
private static void CountIt(string s)
{
// 方法1・LINQを使う
var n1 = s.Count(c => c == 'A');
// 方法2・IndexOfを繰り返す
var idx = 0;
var n2 = 0;
for (; ; )
{
idx = s.IndexOf('A', idx + 1);
if (idx <= 0) break;
n2++;
}
// 方法3・単純ループ
var n3 = 0;
foreach (var item in s) if (item == 'A') n3++;
// 方法4・Where+Count
var n4 = s.Where(c => c == 'A').Count();
Console.WriteLine($"{s}にAは{n1}個含まれています。");
Console.WriteLine($"{s}にAは{n2}個含まれています。");
Console.WriteLine($"{s}にAは{n3}個含まれています。");
Console.WriteLine($"{s}にAは{n4}個含まれています。");
}
static void Main()
{
CountIt("KAWAMATA");
CountIt("MEITANTEI CONAN");
CountIt("KAMADO TANJIRO");
}
}
実行結果
KAWAMATAにAは4個含まれています。
KAWAMATAにAは4個含まれています。
KAWAMATAにAは4個含まれています。
KAWAMATAにAは4個含まれています。
MEITANTEI CONANにAは2個含まれています。
MEITANTEI CONANにAは2個含まれています。
MEITANTEI CONANにAは2個含まれています。
MEITANTEI CONANにAは2個含まれています。
KAMADO TANJIROにAは3個含まれています。
KAMADO TANJIROにAは3個含まれています。
KAMADO TANJIROにAは3個含まれています。
KAMADO TANJIROにAは3個含まれています。