2017-02-22 3 views
0

単純なkey,value形式のファイルが1行に1つあります。 例えば:私はLINQと一度にDictionary<string,string>にこれを読んしようとしているこのLINQでファイルを正しく解析できないのはなぜですか?

word1,filepath1 
word2,filepath2 
word3,filepath5 

。ファイルにはいくつかの重複があります(最初の部分、最初の文字列は重複しています)。この場合、重複を削除しても大丈夫です。

作業されていない。これは私のLINQです:

var indexes = File.ReadAllLines(indexFileName) 
    .Select(x => x.Split(',')) 
    .GroupBy(x=>x[0]) 
    .ToDictionary(x => x.Key, x => x.ElementAt(1)); 

ToDictionary部分が私を混乱さ、私はグループから最初の値を取得し、辞書の値に割り当てる方法を教えてください。

System.ArgumentOutOfRangeException: 'Specified argument was out of the range of valid values.'例外が発生します。

+2

上記のコードは機能していないので、何かエラーがありますか? –

+1

それはあなたがそれを期待している方法で動作していないように聞こえる。それはあなたに何を与えるのですか? – krillgar

+3

*グループから最初の値を取得する方法* - 適切に名前が付けられた 'First()'メソッドが私の選択です。 –

答えて

2
var indexes = File.ReadAllLines(indexFileName) 
        .Select(x => x.Split(',')) 
        .GroupBy(x => x[0]) 
        .ToDictionary(x => x.Key, x => x.First()[1]); 
2

ここで問題となるのは、文字列ではなく配列をグループ化することです。したがって、ToDictionary()ラムダで扱っているグループオブジェクトは、文字列ではなく配列の列挙型です。 g.ElementAt(0)は文字列ではありません。これは、文字列の最初の配列です:

その後、

g.Key == "word1" 

g.ElementAt(0)だからあなたがg.ElementAt(0).ElementAt(1)、またはg.First()[0]、またはその効果に何かをしたい...

{ "word1", "filepath1" } 

あるとき。

これは、後で知る限り痛みを伴いますが、残念ながらは私のために、

Matthew Whitedの回答を受け入れると、できるだけ早く分割線を匿名オブジェクトにすることでコードを明確にすることをお勧めします。 ElementAt(1)はあまり通信しません。

var indexes = 
    File.ReadAllLines(indexFileName) 
    .Where(s => !String.IsNullOrEmpty(s)) 
    .Select(x => x.Split(',')) 
    // Turn the array into something self-documenting 
    .Select(a => new { Word = a[0], Path = a[1] }) 
    .GroupBy(o => o.Word) 
    .ToDictionary(g => g.Key, g => g.First().Path) 
    ; 

各行をオブジェクトに変換すると、私は考えるのが楽になり、Intellisenseもチームでプレイを開始します。

+2

うまくやった。それ以外にも、少なくとも1人のメンバーが常にいるため、最初はグループには安全です。 –

+0

@DavidBそうですね、少なくとも1人のメンバーがいなければそこにはいませんか?ありがとう!そしてその迷子の「x」を見つけてくれてありがとう。 –

関連する問題