2013-02-12 2 views
0

.txt 파일에서 값을 dictionary으로 가져 오려고합니다. .txt 파일은 다음과 같이 포맷 :파일에서 keyvalue 쌍을 사전에 추가 하시겠습니까?

도널드 덕, 등등 2010년 4월 3일

그리고 ... 각 라인에 같은 1 개 항목이 있습니다. dictionary에 분할 문자열을 추가하려고하면 문제가 발생합니다.

나는 이것을 다음과 같이 시도하고있다 : scoreList.Add(values[0], values[1]); 그러나 그 이름은 문맥에 존재하지 않는다고 말한다. 나는 누군가가 이것에 대해 올바른 방향으로 나를 가리킬 수 있기를 바랍니다. ...

고마워요! 귀하의 values 변수

private void Form1_Load(object sender, EventArgs e) 
    { 
      Dictionary<string, DateTime> scoreList = new Dictionary<string, DateTime>(); 
      string path = @"list.txt"; 
      var query = (from line in File.ReadAllLines(path) 
         let values = line.Split(',') 
         select new { Key = values[0], Value = values[1] }); 

      foreach (KeyValuePair<string, DateTime> pair in scoreList) 
      { 
       scoreList.Add(values[0], values[1]); 
      } 
      textBox1.Text = scoreList.Keys.ToString(); 
    } 

답변

3

만 LINQ 쿼리 내의 범위에 있습니다.

말했다되고 그건
foreach (var pair in query) 
{ 
    scoreList.Add(pair.Key, pair.Value); 
} 

는, LINQ는 당신을 도울 수있는 ToDictionary 확장 방법을 제공합니다 : 당신은 쿼리 결과를 열거하고, 사전에 값을 추가해야합니다. 당신은 당신의 루프를 대체 할 수 : 유형이 정확하기

scoreList = query.ToDictionary(x => x.Key, x => x.Value); 

마지막으로, 당신은, 예를 들어, 사용 DateTime에 값을 변환 DateTime.Parse이 필요합니다.

+0

지금 textBox1에 값을 표시하는 데 문제가 있습니다. 메신저 사용 : var lines = scoreList.Select (kv => kv.Key + ","+ kv.Value.ToString()); textBox1.Text = string.Join (Environment.NewLine, lines); 하지만 빈 결과 만 나타납니다. 이유에 대한 단서가 있습니까? –

+0

죄송합니다! 나는 그것을 지금 일할 수 있었다. 문제는 동일한 이름의 .txt 파일에 항목을 저장할 때 오류 메시지가 나타납니다. System.ArgumentException : 동일한 키를 가진 항목이 이미 추가되었습니다. 같은 이름의 키가 많아 사전에 적합하지 않을 수도 있으므로 무엇을 조사해야합니까? –

1

먼저 당신이 그것을 잘못하고있다, 당신은 목록에서 항목을 추가해야하지 값 [0] 값 [1] LINQ에서 사용 ...

Dictionary<string, DateTime> scoreList = new Dictionary<string, DateTime>(); 

    string path = @"list.txt"; 

    var query = (from line in File.ReadAllLines(path) 
       let values = line.Split(',') 
       select new { Key = values[0], Value = values[1] }); 

    foreach (var item in query) /*changed thing*/ 
    { 

     scoreList.Add(item.Key, DateTime.Parse(item.Value)); /*changed thing*/ 
    } 

    textBox1.Text = scoreList.Keys.ToString(); 
1

코드를 가진 즉시 문제는 values을 것입니다 쿼리 식에만 존재합니다 ... 시퀀스에는 KeyValue 속성을 가진 익명 형식의 요소 형식이 있습니다.

다음 문제는 다음 ...로 시작하는 비어있는, scoreList 반복하고 당신이 string에서 DateTime로 변환 할 계획 곳의 징후도 없다는 것이다. 아, 그리고 Dictionary<,>.Keys.ToString()이 도움이 될지 모르겠습니다.

당신은 그러나 단순히 충분한 사전을 구축 할 수 있습니다 :

var scoreList = File.ReadLines(path) 
        .Select(line => line.Split(',')) 
        .ToDictionary(bits => bits[0], // name 
            bits => DateTime.ParseExact(bits[1], // date 
               "yyyy-MM-dd", 
               CultureInfo.InvariantCulture)); 

주를 대신 DateTime.ParseDateTime.ParseExact의 사용을 - 당신은 데이터의 형식을 알고있는 경우, 해당 정보를 사용합니다.