Я бы изучил использование класса System.TimeZoneInfo, если вы в .NET 3.5. См. http://msdn.microsoft.com/en-us/library/system.timezoneinfo.aspx . Это должно учитывать изменения дневного света.
// Coordinated Universal Time string from
// DateTime.Now.ToUniversalTime().ToString("u");
string date = "2009-02-25 16:13:00Z";
// Local .NET timeZone.
DateTime localDateTime = DateTime.Parse(date);
DateTime utcDateTime = localDateTime.ToUniversalTime();
// ID from:
// "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Time Zone"
// See http://msdn.microsoft.com/en-us/library/system.timezoneinfo.id.aspx
string nzTimeZoneKey = "New Zealand Standard Time";
TimeZoneInfo nzTimeZone = TimeZoneInfo.FindSystemTimeZoneById(nzTimeZoneKey);
DateTime nzDateTime = TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, nzTimeZone);
Ваш код почти у цели. Хотя похвально не хотеть хранить все это в памяти, вам придется хранить совокупные компоненты предыдущей строки:
Я хотел бы сравнить строку с предыдущей, не сохраняя ничего в памяти (без словарей).
blockquote>Чтобы иметь возможность суммировать подсчеты по всем предыдущим строкам с похожим словом, вам нужно поддерживать некоторое состояние.
Обычно эта работа подходит для
awk
. Вы можете рассмотреть эту команду:awk '{a[$1] += $2} p && p != $1{print p, a[p]; delete a[p]} {p = $1} END { print p, a[p] }' file
a 2 file 7 for 1 has 1 is 2 lines 1 small 3 test 3 this 3 two 1
Используя
delete
, это решение не хранит весь файл в памяти. Состояние сохраняется только на время обработки строк с одним и тем же первым словом.Awk Ссылки:
Основная логика - отслеживать предыдущее слово. Если текущее слово соответствует, накапливать счет. Если нет, напечатайте предыдущее слово и его счет и начните все сначала. Есть небольшой специальный код для обработки первой и последней итераций.
stdin_data = [
"a 2",
"file 1",
"file 2",
"file 4",
"for 1",
"has 1",
"is 2",
"lines 1",
"small 1",
"small 2",
"test 1",
"test 2",
"this 1",
"this 2",
"two 1",
]
previous_word = ""
word_ct = 0
for line in stdin_data:
word, count = line.split()
if word == previous_word:
word_ct += int(count)
else:
if previous_word != "":
print(previous_word, word_ct)
previous_word = word
word_ct = int(count)
# Print the final word and count
print(previous_word, word_ct)
Вывод:
a 2
file 7
for 1
has 1
is 2
lines 1
small 3
test 3
this 3
two 1