Как игнорировать дубликаты из моего текстового файла, используя.ToDictionary, я всегда получал сообщение об ошибке: "Элемент с тем же ключом уже добавлен"

Я получил эту ошибку:

"Элемент с тем же ключом уже добавлен"

Есть ли другой лучший подход?

Я действительно ценю чью-либо помощь по этому коду

Вот мой код

       string textfiletest = "C:/BSM_Command_v2.txt";
       var data = File 
       .ReadAllLines(textfiletest)
       .Select(x => x.Split(':'))
       .Where(x => x.Length > 1)
      .ToDictionary(x => x[0].Trim(), x => x[1]);

Вот мой текстовый файл

 RTRV-BTS_CALL_ACCESS-DATA : BTS=3~3
 M4010 RETRIEVE BTS CALL ACCESS DATA
   PRIMARY_BSC_ID        : 0                                             
   PRIMARY_BSC_RACK_ID   : 1                                             
   PRIMARY_CMP_IP_V4     : 10.233.56.133                                 
   SECONDARY_USED_FLAG   : ON                                            
   SECONDARY_BSC_RACK_ID : 0                                             
   SECONDARY_CMP_IP_V4   : 10.233.56.69                                  
   CALL_ACCESS_CONTROL_1 : 0                                             
   CALL_ACCESS_CONTROL_2 : 0                                             
   CALL_ACCESS_CONTROL_3 : 0                                             
   CALL_ACCESS_CONTROL_4 : 0                                             
   CALL_ACCESS_CONTROL_5 : 0                                             
   CALL_ACCESS_CONTROL_6 : 0                                             
   CALL_ACCESS_CONTROL_7 : 0                                             
   CALL_ACCESS_CONTROL_8 : 0                                             
   RESULT = OK
 COMPLETED


 RTRV-BTS_EVDO_CALL_ACCESS-DATA : BTS=3~3
 M4029 RETRIEVE BTS EVDO CALL ACCESS DATA
   PRIMARY_BSC_ID        : 0                                             
   PRIMARY_BSC_RACK_ID   : 1                                             
   PRIMARY_CMP_IP_V41     : 10.233.56.133                                 
   SECONDARY_USED_FLAG   : ON                                            
   SECONDARY_BSC_RACK_ID : 0                                             
   SECONDARY_CMP_IP_V4   : 10.233.56.69                                  
   RESULT = OK
 COMPLETED

2 ответа

Решение

Если вы хотите просто игнорировать дубликаты, здесь есть возможность сгруппировать все по ключу и выбрать в качестве значения первого члена группы.

   string textfiletest = "C:/BSM_Command_v2.txt";
   var data = File 
   .ReadAllLines(textfiletest)
   .Select(x => x.Split(':'))
   .Where(x => x.Length > 1)
   .GroupBy(x => x[0].Trim())
   .ToDictionary(x => x.Key, x => x.First()[1]);

Написать десять строк кода и создать словарь вручную?

var data = File 
   .ReadAllLines(textfiletest)
   .Select(x => x.Split(':'))
   .Where(x => x.Length > 1);

var dict = new Dictionary<string, string>();

foreach (string[] parts in data)
{
    string key = parts[0].Trim();

    if (!dict.ContainsKey(key))
    {
        dict.Add(key, parts[1]);
    }
}

Обратите внимание, что это "игнорирует" повторяющиеся строки и сохранит только первую найденную строку для каждой группы строк с одинаковым "ключом".

Код можно даже написать более LINQ-способом:

var data = File
    .ReadAllLines(textfiletest)
    .Select(x => x.Split(':'))
    .Where(x => x.Length > 1)
    .GroupBy(x => x[0].Trim(), x => x[1])
    .ToDictionary(x => x.Key, x => x.First());

Вы .GroupBy() ключ, и для каждой группы вы берете .First() ценить и использовать его в .ToDictionary()

Другое решение заключается в использовании .ToLookup(), который возвращает ILookup<TKey, TElement>это что-то очень похожее на Dictionary<TKey, TElement[]>Итак, многозначный словарь:

var data = File
    .ReadAllLines(textfiletest)
    .Select(x => x.Split(':'))
    .Where(x => x.Length > 1)
    .ToLookup(x => x[0].Trim(), x => x[1]);
Другие вопросы по тегам