문제

저는 기본적인 C#콘솔 응용 프로그램을 읽어주는 텍스트 파일(CSV 형식으로)행과 데이터를 넣으로 해시 테이블.첫 번째 CSV 항목이 라인은 키(id 숫자)나머지 라인의 값으로 설정합니다.그러나 내가 있다는 것을 발견했습 내 import 파일에는 몇 가지 중복된 키는다고 말합니다.려고 하면 파일을 가져오려면 응용 프로그램에 오류가할 수 없기 때문에 중복된 키에 해시 테이블.내 프로그램을 처리할 수 있는 이러하지만.면하는 경우 중복된 키를 넣고 싶은 그 열쇠로 arraylist 고 계속 가져오는 데이터의 나머지 부분으로 해시 테이블.이렇게 하려면 어떻게 해야 합니까 C#

여기에는 나의 코드:


개인 정 Hashtable importFile(Hashtable myHashtable,문자열 myFileName) {

        StreamReader sr = new StreamReader(myFileName);
        CSVReader csvReader = new CSVReader();
        ArrayList tempArray = new ArrayList();
        int count = 0;

        while (!sr.EndOfStream)
        {
            String temp = sr.ReadLine();
            if (temp.StartsWith(" "))
            {
                ServMissing.Add(temp);
            }
            else
            {
                tempArray = csvReader.CSVParser(temp);
                Boolean first = true;
                String key = "";
                String value = "";

                foreach (String x in tempArray)
                {
                    if (first)
                    {
                        key = x;
                        first = false;
                    }
                    else
                    {
                        value += x + ",";
                    }
                }
                myHashtable.Add(key, value);
            }
            count++;
        }

        Console.WriteLine("Import Count: " + count);
        return myHashtable;
    }
도움이 되었습니까?

해결책

if (myHashtable.ContainsKey(key))
    duplicates.Add(key);
else
    myHashtable.Add(key, value);

다른 팁

더 나은 솔루션을 통 ContainsKey 확인하려면 키를 존재를 추가하기 전에 그것을 이 해시 테이블 대신 합니다.던지는 예외에서 이러한 종류의 오류는 성능이 저하되지 않을 개선 프로그램으로 흐릅니다.

ContainsKey 일정한 O(1)오버헤드를 위해 모든 항목을 잡는 동안에는 예외는 성능이 저하됩니다에 단지 중복 항목입니다.

대부분의 상황에서,나는 말을 확인에 대한 열쇠이지만,이 경우에는,그것의 더 나은 잡는 예외입니다.

여기에는 솔루션을 피하는 여러에 이차 목록과 함께 작은 오버헤드를 모든 삽입:

Dictionary<T, List<K>> dict = new Dictionary<T, List<K>>();

//Insert item
if (!dict.ContainsKey(key))
   dict[key] = new List<string>();
dict[key].Add(value);

할 수 있는 포장이 사전에서는 형식 숨기 또는 이에 넣어 방식 또는 확장자 방법에는 사전.

개 이상인 경우 4(예를 들어)CSV 값,그것에 가치가 있는 설정 사용할 변수를 StringBuilder 이후뿐만 아니라 문자열 연결이 느린 기능입니다.

Hmm,1.7Million lines?나는 것을 망설이를 제공하는 종류의 짐입니다.

러기위해 다음과 같은 방법을 사용하여 이 작업을 수행 LINQ.

CSVReader csvReader = new CSVReader();
List<string> source = new List<string>();
using(StreamReader sr = new StreamReader(myFileName))
{
  while (!sr.EndOfStream)
  {
    source.Add(sr.ReadLine());
  }
}
List<string> ServMissing =
  source
  .Where(s => s.StartsWith(" ")
  .ToList();
//--------------------------------------------------
List<IGrouping<string, string>> groupedSource = 
(
  from s in source
  where !s.StartsWith(" ")
  let parsed = csvReader.CSVParser(s)
  where parsed.Any()
  let first = parsed.First()
  let rest = String.Join( "," , parsed.Skip(1).ToArray())
  select new {first, rest}
)
.GroupBy(x => x.first, x => x.rest)   //GroupBy(keySelector, elementSelector)
.ToList()
//--------------------------------------------------
List<string> myExtras = new List<string>();
foreach(IGrouping<string, string> g in groupedSource)
{
  myHashTable.Add(g.Key, g.First());
  if (g.Skip(1).Any())
  {
    myExtras.Add(g.Key);
  } 
}

여러분 모두에게 감사드립니다.나는 끝까지 사용하여 ContainsKey()메소드가 있습니다.그것은 어쩌면 30 초상에 대한 미세구가 있습니다.나는 선적 약 1.7million 라인과 프로그램에 대해로 7 분 총을 로드하는 두 개의 파일을 비교하고,쓰는 몇 가지 파일이 있습니다.그것은 단지 약 2 초을 비교하고를 작성한 파일.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top