2011-12-06 3 views
4

나는 Dictionary<string, int>을 가지고 있으며 목록에서 일부 문자열을 읽고 있습니다 ... 사전에 추가하고 싶지만 사전에 문자열이 이미 있으면 값을 1 씩 증가 시키길 원합니다사전 <string, int> 증가 값

시도한 코드는 다음과 같습니다. 그러나 모든 입력에 따라 증가하는 일부 문자열이 있습니다. 문제가 있습니까?

Dictionary<string, int> dictionary = new Dictionary<string, int>(); 
    foreach (String recordline in tags) 
    { 
     String recordstag = recordline.Split('\t')[1]; 
     String tagToDic = recordstag.Substring(0, (recordstag.Length-1)); 

     if (dictionary.ContainsKey(tagToDic) == false) 
     { 
      dictionary.Add(tagToDic, 1); 
     } 
     else 
     { 

      try 
      { 
       dictionary[tagToDic] = dictionary[tagToDic] + 1; 
      } 
      catch (KeyNotFoundException ex) 
      { 
       System.Console.WriteLine("X" + tagToDic + "X"); 
       dictionary.Add(tagToDic, 1); 
      } 
     } 
    } 

편집 : 그것은 항상 빈 공간이기 때문에 문자열의 마지막 문자를 제거하고 ... 당신의 의견에 대답하기 위해 ... 내 입력은 같은 것입니다 :

10000301 business 0 0,000 
10000301 management & auxiliary services  0 0,000 
10000316 demographie  0 0,000 
10000316 histoire de france 0 0,000 
10000347 economics 0 0,000 
10000347 philosophy 1 0,500 

와 나는 "비즈니스"또는 "관리 & 보조 서비스"등의 문자열 만 원할 수 있습니다.

+2

그것은 가치가 무엇인지, 당신이 당신의 코드를 정리할 수 있습니다 들어 * 많은 * : http://codepad.org/3DD4H1zl – Ryan

+6

샘플 입력 보고있는 동작을 나타내는 문자열? –

+1

질문을 명확히하기 위해 조작하려는 문자열의 예를 들어주십시오. – lafama

답변

2

사전은 필요하지 않으며이 Linq 쿼리를 사용하여 해결할 수 있습니다.

var q = 
    from s in tags.Select (t => t.Substring(t.IndexOf("\t"))) 
    group s by s into g 
    select new 
    { 
     g.Key, 
     Count = g.Count() 
    }; 

을 그리고 당신은 사전으로 필요한 경우 만 추가 (당신이 \t 후 전체 문자열을 원하는 가정) :

var dic = q.ToDictionary (x => x.Key, x => x.Count); 
1

첫 번째는 다음 문자열의 분할 귀하의 입력 문자열 그것은 tagToDic으로 돌아 왔습니다. 따라서 n 개의 문자열은 과 같음 tagToDic입니다.

0

기존 값에서 카운트를 검색 한 후에 사전 값을 다시 추가하는 것이 더 쉽습니다.

다음은 조회 논리를 처리하기위한 몇 가지 의사 코드입니다.

Dictionary<string, int> _dictionary = new Dictionary<string, int>(); 

private void AdjustWordCount(string word) 
{ 

    int count; 
    bool success = _dictionary.TryGetValue(word, out count); 

    if (success) 
    { 
    //Remove it 
    _dictionary.Remove(word); 
    //Add it back in plus 1 
    _dictionary.Add(word, count + 1); 
    } 
    else //could not get, add it with a count of 1 
    { 
    _dictionary.Add(word, 1); 
    } 
} 
0

방법에 대해 :

Dictionary<string, int> dictionary = new Dictionary<string, int>(); 
string delimitedTags = "some tab delimited string"; 
List<string> tags = delimitedTags.Split(new char[] {'\t'}, StringSplitOptions.None).ToList(); 
foreach (string tag in tags.Distinct()) 
{ 
    dictionary.Add(tag, tags.Where(t => t == tag).Count()); 
} 
0

당신은 당신이 할 수 단지 그룹 목록에 그들을 가지고 목록을 확인합니다.

list.GroupBy(recordline => recordline.Split('\t').Substring(0, (recordstag.Length-1), 
    (key, ienum) => new {word = key, count = ienum.Count()}); 

그런 다음 사전에 넣거나 반복 할 수 있습니다.

0

dictionary 코드는 예상대로 작동합니다.

내 생각 엔 문자열 분할 코드가 올바르게 작동하지 않는 것 같습니다.
그러나이를 확인하기 위해 몇 가지 샘플 입력을 제공해야합니다.

어쨌든, 코드의 전체 블록은 단순화로 LINQ로 다시 작성할 수 있습니다 :

var dictionary = tags 
    .Select(t => { 
     var recordstag = t.Split('\t')[1]; 
     return recordstag.Substring(0, recordstag.Length-1); 
    }) 
    .GroupBy(t => t) 
    .ToDictionary(k => k.Key, v => v.Count()) 
    ; 
+0

'recordstag.Substring (0, recordstag.Length-1); '에 대한 필요성을 이해하지 못했습니다. 마지막 숯을 왜 제거해야합니까? – Kash

+2

@Kash 모름지, 왜 나 한테 묻는거야? Ask @ SpDaglas! –

+0

나는 그랬다. 당신이 그것에 대해 통찰력을 갖고 있는지 궁금합니다. – Kash

6

당신은 입력 문자열 배열의 각 문자열을 분할하고, 문자열 배열에서 두번째 문자열을 선택합니다. 그런 다음 SubString을 사용하여이 두 번째 문자열의 마지막 문자를 제거합니다. 따라서 마지막 문자에서만 다른 모든 문자열은 동일하게 간주되고 증분됩니다. 그 이유는 "모든 입력에 따라 증가하는 일부 문자열"을 보게되는 이유입니다.

EDIT : 마지막 문자를 제거하는 것이 공간을 제거하는 것이라면 String.Trim을 대신 사용하십시오. 또 다른 편집은 ContainsKey 대신 TryGetValue를 사용하여 값을 증가시키는 것이 더 좋습니다. 코드는 아래에서 편집되었습니다.

이 시도 :

Dictionary<string, int> dictionary = new Dictionary<string, int>(); 
    foreach(string recordline in tags) 
    { 
     string recordstag = recordline.Split('\t')[1].Trim(); 
     int value; 
     if (!dictionary.TryGetValue(recordstag, out value)) 
     dictionary.Add(recordstag, 1); 
     else 
     dictionary[recordstag] = value + 1; 
    } 
0

확장 방법

public static void Increment(this Dictionary<string, int> dictionary, string key) 
{ 
    int val; 
    dictionary.TryGetValue(key, out val); 
    if (val != null) 
     dictionary[key] = val + 1; 
} 

Dictionary<string, int> dictionary = new Dictionary<string, int>(); 
// fill with some data 

dictionary.Increment("someKey"); 
관련 문제