2015-09-28 4 views
1

У меня есть текстовый файл, называемый, например, PM.INX, который представляет собой список данных файла с разделителями-запятыми, с четырьмя полями в строке. Файлы (около 12, с разными именами файлов, но с той же структурой) могут содержать 20-30 строк или несколько сотен строк. Несколько примеров линий будут выглядеть так:Проверить объединение строк с разделителями для дубликатов

"2FLAT0.6","2FLAT0£6",2,33.82 
"BZ95M","BZ95M",1,36.26 
  • поле 1 является фактическим именем;
  • Поле 2 - это переименованный файл с любыми полными остановками, амперсандами или плюс знаками, измененными для «£»;
  • Поле 3 - это код для секса - 1 для мужчин, 2 для женщин; и
  • Поле 4 является суммой контрольной суммы элементов в файле.

Когда пользователь хочет добавить новый элемент, мне нужно проверить, существует ли это, поэтому необходимо разделить каждую строку и проверить, что новый элемент еще не существует, по сравнению с первым элементом.
Итак, я мог прочитать файл в строке [], затем пропустить каждый элемент, разделить данные по строке и проверить на свой новый элемент, но задавался вопросом, есть ли другой способ (LINQ?) Для этого?

+1

Какая польза будет LINQ предложение над петлями? Как выглядит ваша петля? Вам нужно будет прочитать весь файл и проанализировать все строки любым способом. – CodeCaster

+0

Я упомянул только LINQ, поскольку я знаю, что он отлично работает, если я проверяю всю строку 'fileContent.Intersect (newContent) .Any()', но хотел задать вопрос. – MartinS

ответ

2

Вы можете сделать это (непроверенный).

items 
    .Select(x=>x.Split(',').Select(y=>y.Trim()).ElementAt(0)) 
    .Any(x=>x == newfilename); 
+0

Спасибо @Niyoko. У меня будет игра! – MartinS

0

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

Однако, если вы хотите добавить много новых элементов, это очень неэффективно. Это (грубо) операция O (n^2). Вы можете свести его к операции O (n), если вы добавите ключи к HashSet<T>. Доступ к набору хешей имеет постоянное время доступа O (1).

Псевдокод

var keys = new HashSet<string>(); 
foreach (line in file) { 
    string[] parts = line.Split(','); 
    keys.Add(parts[0]; 
} 

foreach (newKey in newKeys) { 
    if (keys.Contains(newKey)) { 
     // Item already exists 
     ... 
    } else { 
     // New item 
     keys.Add(newKey); 
     ... 
    } 
} 
+0

Спасибо @Oliver. Это может быть один или несколько новых элементов, что стало причиной того, что я задал этот вопрос, так как он не интересовался циклом несколько раз, чтобы проверять каждый файл. Благодарю. Мартин – MartinS

Смежные вопросы