IEnumerable<string>
次のような拡張メソッドを使用してこれを行うことができます。
public static class EnumerableExtensions
{
public static bool Contains( this IEnumerable<string> source, string value, StringComparison comparison )
{
if (source == null)
{
return false; // nothing is a member of the empty set
}
return source.Any( s => string.Equals( s, value, comparison ) );
}
}
次に変更
if (destlinestotal.Contains( sline ))
に
if (destlinestotal.Contains( sline, StringComparison.OrdinalIgnoreCase ))
ただし、セットが大きい場合、および/またはこれを頻繁に行う場合、その方法は非常に非効率的です。基本的に、O(n 2 ) 操作を行っています。ソースの各行に対して、場合によっては宛先のすべての行と比較します。大文字と小文字を区別しない比較子を使用して宛先列から HashSet を作成し、宛先列の HashSet に各列が存在するかどうかを確認するソース列を反復処理することをお勧めします。これは O(n) アルゴリズムになります。HashSet の Contains は、コンストラクターで指定した比較子を使用することに注意してください。
string[] sourcelinestotal =
File.ReadAllLines("C:\\testdirectory\\" + "sourcecolumns.txt");
HashSet<string> destlinestotal =
new HashSet<string>(
File.ReadAllLines("C:\\testdirectory\\" + "destcolumns.txt"),
StringComparer.OrdinalIgnoreCase
);
foreach (string sline in sourcelinestotal)
{
if (!destlinestotal.Contains(sline))
{
File.AppendAllText("C:\\testdirectory\\" + "missingcolumns.txt", sline);
}
}
IEnumerable<string>
振り返ってみると、他の何かのメソッドが必要でない限り、大文字と小文字を区別しない独自の contains を単に記述するよりも、このソリューションを実際に好みます。実際には、HashSet 実装を使用して維持する (独自の) コードは少なくなります。