2017-05-04 8 views
2

가 나는 예를C#에서 해시 테이블의 단일 키에 둘 이상의 값을 추가하는 중?

Book: Cover with Papers in between 
Book: Reserve 

를 들어, 단어와 그 의미가 문자열을 읽고 내 코드를 시도 할 때마다 각 키가 고유해야하기 때문에 오류가 발생하는 경우 프로그램을 만들기 위해 노력하고있어. 이 문제를 해결할 방법이 있습니까?

Hashtable ht = new Hashtable(); 
     var fileStream = new FileStream(@"e:\test.txt", FileMode.Open, FileAccess.Read); 
     using (var streamReader = new StreamReader(fileStream, Encoding.UTF8)) 
     { 

      string line; 
      while ((line = streamReader.ReadLine()) != null) 
      { 
       ht.Add(line.Split(':')[0], line.Split(':')[1]); 
      } 
     } 

     if (ht.ContainsKey("Book")) 
     { 
      listBox1.Items.Add(ht["Book"].ToString()); 
     } 

답변

3

을, 당신은 List<string>을 사용할 수 있습니다 그 값은 Add입니다. 그러나, 당신은 아마 ToLookup를 통해 LINQ으로 간소화 할 수 있습니다 :

var groups = File.ReadLines(path) 
      .Select(line => line.Split(':')) 
      .ToLookup(x => x[0], x => x[1].Trim()); 

지금 당신은 접두사로 당신에게 모든 값을 제공하는 groups[key]에 액세스 할 수 있습니다, 또는 당신은 foreach groups 이상 .Key와 값의 각 조합을 얻을 수 있습니다. 코드의 관점에서

이는 다음과 같습니다

var groups = File.ReadLines(@"e:\test.txt") 
      .Select(line => line.Split(':')) 
      .ToLookup(x => x[0], x => x[1].Trim()); 

foreach(var val in groups["Book"]) 
    listBox1.Items.Add(val); 

그러나

(첫번째 존재를 확인 할 필요가 그냥 아무 일치하는 경우 제대로 작동하지 않습니다)! 그래도 필요하다면 모두뒤에 뒤에 groups을 사용하면됩니다. 당신이하지 않으면, 당신은 더 검소 할 수 있고 단지 원치 않는 데이터 포기 :

var values = File.ReadLines(@"e:\test.txt") 
      .Where(line => line.StartsWith("Book:")) 
      .Select(line => line.Substring(5).Trim()); 

foreach(var val in values) 
    listBox1.Items.Add(val); 

편집 : 사소한 일 - 애 태우게 방법 서명이 line.Split(':') 실제로마다 배열을 생성하는 의미를 params 때문에; 그래서 일반적으로 사용

static readonly char[] Colon = {':'}; 

하고 뜨거운 경로 경우 잴 더 효율적입니다

line.Split(Colon) 

.

+0

고맙습니다. 내 코드에 적용 해 주시면 감사하겠습니다. 그래도 작동하는 방식을 볼 수 있습니다. – Cor

+0

@ 확실한; 하지만 : 접두사로'Book'을 사용하는 2 줄이 있다면, 목록 상자에서 어떤 값을 사용하고 싶습니까? 모두들? 또는 첫 번째? 아니면 마지막? –

+0

♦이 예제의 'book'에는 모두 두 가지 의미가 있습니다. 두 가지를 모두 목록에 추가하고 싶습니다. 감사! – Cor

0

해시 테이블 대신 Dictionary<string, List<string>>을 사용하십시오.

2

를 사용하여 값을 문자열 목록입니다 사전 :

var myDicitonary = new Dictionary<string, List<string>> 

그리고 지금, 당신은 다음 할 거라고 : 일반적인 경우

if (!myDictionary.ContainsKey(key)) 
{ 
    myDicitonary.Add(key, new List<string>()); 
} 

myDicitonary[key].Add(value); 
0

대신 사전을 사용하십시오.

Dictionary<string, list<string>> dic = new Dictionary<string, list<string>();