2

2 つの異なるテキスト ファイルからデータを読み込んでいる 2 つのハッシュセットがあります。両方のテキスト ファイルの内容は次のようになります。

name/12441431252132
name1/323244231244142
name2/32423452524234

現在、両方のファイルをロードし、textFile2 からの一意の結果のみが得られるようにする私のコード:

HashSet<string> txt1 = new HashSet<string>(File.ReadLines("textFile1.txt"));
HashSet<string> txt2 = new HashSet<string>(File.ReadLines("textFile2.txt"));

txt2.ExceptWith(txt1); 

私の問題は、行全体が一致する場合にのみ、基準に基づいて行を削除することです。代わりに名前ベースに基づいて削除したい。たとえば、/ の後の ID が異なっていても、name2 が textFile1 にある場合は含めないでください。

どうすればこれを達成できますか?

私の説明が良くない場合はお知らせください。改善に努めます。私の英語を許してください。

4

3 に答える 3

3

名前と残りのコンテンツを分離するために文字列分割を追加するだけです。このアプローチは少し「汚い」ので、実際のコードではおそらく foreach ループを使用し、専用のクラスを導入します。

var content = File.ReadLines("textFile1.txt").Select(line => 
{
    var parts = line.Split('/');
    return new 
    { 
        Name = parts[0],
        Content = parts[1]
    };
});

HashSet<string> names = new HashSet<string>(content.Select(c=> c.Name));
HashSet<string> txt2 = new HashSet<string>(File.ReadLines("textFile2.txt"));
var uniques = txt2.Where(line => !names.Contains(line.Split('/')[0]));
于 2012-05-22T15:15:43.767 に答える
0

で分割/すると、最初のセットに表示される名前の HashSet を作成してから、最初のセットに表示されない名前を持つ 2 番目のセットの項目を選択できます。

var nameValues1=
    File
     .ReadLines(fileName)
     .Select(line=>line.Split('/'))
     .Select(parts=>new {name=parts[0],value=parts[1]});
var nameValues2=
    File
     .ReadLines(fileName2)
     .Select(line=>line.Split('/'))
     .Select(parts=>new {name=parts[0],value=parts[1]});
var names1=new HashSet<string>(nameValues1.Select(nv=>nv.name);
var result=
    nameValues2
     .Where(nv=>!names1.Contains(nv.name))
     .Select(nv=>string.Format("{0}/{1}",nv.name,nv.value);
于 2012-05-22T15:20:10.503 に答える
0

HashSetaが依然として最良の選択であると確信していますか? を使用した別のアプローチを次に示しますDictionary<String, String>

var lines1 = System.IO.File.ReadLines(path1);
var lines2 = System.IO.File.ReadLines(path2);
var allItems = new Dictionary<String, String>();
foreach (var line in lines1.Concat(lines2))
{
    String[] tokens = line.Split('/');
    if (tokens.Length == 2)
    {
        String name = tokens[0];
        String number = tokens[1];
        if (!allItems.ContainsKey(name))
            allItems.Add(name, number);
    }
}
于 2012-05-22T15:30:01.973 に答える