Удаление строк из строки + старые записи из словаря в C # - PullRequest
0 голосов
/ 30 ноября 2009

У меня есть словарь, первая строка, ключ, никогда не должен изменяться .. он не может быть удален или что-нибудь еще ... но значение, я продолжаю добавлять строки, строки и строки к значениям ... я просто создаю новую строк с \ r \ n или \ r .. и мне просто интересно, что было бы самым простым способом сохранить только последние 50 строк. и удалите что-нибудь более 50 строк .. я делаю это, потому что когда я возвращаю его, мне нужно поместить значения через массив символов и пройти каждую букву, и это может быть медленным, если данных слишком много. какие-либо предложения?

Ответы [ 2 ]

2 голосов
/ 30 ноября 2009

Общая идея Guffa верна - ваша структура данных должна отражать то, что вы на самом деле хотите, а именно список строк , а не одну строку. Понятие «последние 50 строк» ​​довольно очевидно связано с коллекцией, а не с одной строкой, даже если вы изначально читали ее таким образом.

Однако я бы предложил использовать LinkedList<T> вместо List<T>: каждый раз, когда вы удаляете первый элемент List<T>, все остальное должно перемешиваться. List<T> отлично подходит для предоставления произвольного доступа и не слишком плох для добавления в конец, но отстой для удаления с начала. LinkedList<T> отлично подходит для предоставления вам доступа к итератору, добавления к / удаления с начала и добавления к / удаления с конца. Это лучше подходит. (Если бы вы действительно хотели поехать в город, вы могли бы даже написать свой собственный тип кольцевого буфера фиксированного размера, который инкапсулировал бы логику для вас; это дало бы лучшее из обоих миров в ситуации, когда вы не хотите иметь возможность расширить за определенный размер.)

Что касается ваших комментариев к ответу Гуффы: довольно распространено преобразовывать ввод в форму, более подходящую для обработки, а затем преобразовывать его обратно в исходный формат для вывода. Причина, по которой вы делаете это, как раз и есть «более подходящий» бит. Вам не нужно анализировать строку на наличие разрывов строк как часть действия «обновление словаря», IMO. В частности, это звучит так, как будто вы в настоящее время вводите идею "строк", где исходный текст просто читается как строки. Вы фактически создаете свой собственный класс «collection», подкрепленный строкой, разделяя строки с помощью переносов строк. Это неэффективно, подвержено ошибкам и намного сложнее в управлении, чем использование встроенных коллекций. При желании легко выполнить преобразование в строку с разделителем-разделителем в конце, но, похоже, вы делаете это слишком рано.

1 голос
/ 30 ноября 2009

Вместо объединения строк используйте Dictionary<string, List<string>>. Когда вы собираетесь добавить строку в список, вы можете проверить количество и удалить первую строку, если в списке уже есть 50 строк:

List<string> list;
if (!theDictionary.TryGetValue(key, out list)) {
  theDictionary.Add(list = new List<string>());
}
if (list.Count == 50) {
  list.RemoveAt(0);
}
list.Add(line);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...