4

私が持っているのは2つのファイルsourcecolumns.txtdestcolumns.txtです。私がする必要があるのは、ソースをdestと比較し、destにソース値が含まれていない場合は、それを新しいファイルに書き出すことです。以下のコードは、次のような大文字と小文字を区別する問題がある場合を除いて機能します。

出典:CPI
宛先:Cpi

これらは大文字のために一致しないため、誤った出力が得られます。どんな助けでも大歓迎です!

string[] sourcelinestotal =
    File.ReadAllLines("C:\\testdirectory\\" + "sourcecolumns.txt");
string[] destlinestotal =
    File.ReadAllLines("C:\\testdirectory\\" + "destcolumns.txt");

foreach (string sline in sourcelinestotal)
{
    if (destlinestotal.Contains(sline))
    {
    }
    else
    {
        File.AppendAllText("C:\\testdirectory\\" + "missingcolumns.txt", sline);
    }
}
4

3 に答える 3

5

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 実装を使用して維持する (独自の) コードは少なくなります。

于 2010-04-28T18:09:31.313 に答える
4

Contains の拡張メソッドを使用します。ここで素晴らしい例がスタック オーバーフローで見つかりましたコードは私のものではありませんが、以下に投稿します。

public static bool Contains(this string source, string toCheck, StringComparison comp) 
{
    return source.IndexOf(toCheck, comp) >= 0;
}

string title = "STRING";
bool contains = title.Contains("string", StringComparison.OrdinalIgnoreCase);
于 2010-04-28T17:58:21.157 に答える
0

string.ToUpper大文字と小文字を区別する必要がない場合は、比較前に行を大文字に変換します。

于 2010-04-28T17:55:42.357 に答える