0

ユーザーによる映画の評価を辞書に保存しようとしています。データが取得されるファイルの形式は次のとおりです。

ユーザー ID | ムービー ID | 評価 | タイムスタンプ

タブ区切りの値です

        //Take the first 100 lines from the file and store each line as a array element of text 
        string[] text = System.IO.File.ReadLines(@File path).Take(100).ToArray();

        //extDic[username] - [moviename][rating] is the structure

        Dictionary<string,Dictionary<string,double>> extDic=new Dictionary<string,Dictionary<string,double>>();
        Dictionary<string, double> movie=new Dictionary<string,double>();
        foreach(string s in text)
        {
            int rating;
            string username=s.Split('\t')[0];
            string moviename=s.Split('\t')[1];
            Int32.TryParse(s.Split('\t')[2], out rating);
            movie.Add(moviename,rating);
            if (extDic.ContainsKey(username))
            {   
                //Error line
                extDic[username].Add(moviename, rating);
            }
            else
            {
                extDic.Add(username, movie);
            }
            movie.Clear();
        }

エラー行に「同じキーを持つアイテムが既に追加されています」というエラーが表示されます。エラーの内容を理解し、if ステートメントで確認して解決しようとしました。しかし、それはそれを解決しません。

また、movie.clear() の意味があるのだろうか?

4

3 に答える 3

1

問題は、すべてのユーザーに同じ辞書を追加しているため、2 人のユーザーが同じ映画を評価したときにこの例外が表示されることです。

int rating;
var result  = from line in text
              let tokens = s.Split('\t')
              let username=tokens[0];
              let moviename=tokens[1];
              where Int32.TryParse(tokens[2], out rating);
              group new {username, Rating=new{moviename,rating}} by username;

上記のコードは、ツリーの観点から見た場合と同様の構造を提供します。検索機能が必要な場合は、単に呼び出すことができます.ToDictionary

var extDic = result.ToDictionary(x=x.Key, x=>x.ToDictonary(y=>y.moviename,y=>y.rating))

LINQ に書き直した理由は、LINQ のような副作用のないものを使用すると、そのような間違いを犯しにくいからです。

于 2013-11-04T08:12:44.263 に答える