|
■No82689 (魔界の仮面弁士) に追記 >> 現在 LINQ を使っていろいろ試してどこまでできるのかテストしているのですが、 > // 可読性を無視して一行で書いてみました > // bool found = dest.Split(',').Select(x => x.Chunk(2)).Any(y => y.All(z => source.Chunk(2).Contains(z)));
調子に乗って、C# 2005 でも書いてみました。 System.Core.dll を参照設定した上で「using System.Linq;」が必要です。
ラムダ式が使えないので、匿名メソッドで代用。 Enumerable の拡張メソッドが使えないので、通常のメソッド呼び出しで代用。 var 宣言が使えないので、変数の型を明示指定して代用。 型推論が不十分なので、型パラメータを明示指定して回避。
string source = "ABCDEFGHIJ"; string dest = "CDIJ,GH";
bool found = Enumerable.Any<IEnumerable<string>> ( Enumerable.Select<string, IEnumerable<string>> ( dest.Split(','), // "CDIJ,GH" ⇒ {"CDIJ", "GH"} delegate(string str) { // "CDIJ" ⇒ {"CD", "IJ"}、"GH" ⇒ {"GH"} return Enumerable.Select<int, string> ( Enumerable.Range(0, str.Length / 2), delegate(int i) { return str.Substring(i * 2, 2); } ); } ), delegate(IEnumerable<string> conditions) { return Enumerable.All<string> ( conditions, // {"CD", "IJ"} または {"GH"} delegate(string keyValue) { return Enumerable.Contains<string> ( // "ABCDEFGHIJ" ⇒ {"AB", "CD", "EF", "GH", "IJ"} Enumerable.Select<int, string> ( Enumerable.Range(0, source.Length / 2), delegate(int i) { return source.Substring(i * 2, 2); } ), keyValue // "CD" または "IJ"、あるいは "GH" ); } ); } );
|