Как игнорировать дубликаты из моего текстового файла, используя.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]);