Вы можете создать метод расширения, подобный ToDictionary (), с той разницей, что он позволяет дублировать. Что-то вроде:
public static Dictionary<TKey, TElement> SafeToDictionary<TSource, TKey, TElement>(
this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector,
Func<TSource, TElement> elementSelector,
IEqualityComparer<TKey> comparer = null)
{
var dictionary = new Dictionary<TKey, TElement>(comparer);
if (source == null)
{
return dictionary;
}
foreach (TSource element in source)
{
dictionary[keySelector(element)] = elementSelector(element);
}
return dictionary;
}
В этом случае, если есть дубликаты, то выигрывает последнее значение.
Я предлагаю вам вместо этого использовать Log4Net , который имеет гораздо больше возможностей настройки.
В качестве альтернативы вы можете написать свою собственную реализацию TraceListener
которые ставят метки времени для вас. Вы можете даже просто унаследовать от TextWriterTraceListener
и переопределить Write
и WriteLine
:
public override void Write(string x)
{
// Use whatever format you want here...
base.Write(string.Format("{0:r}: {1}", DateTime.UtcNow, x));
}
public override void WriteLine(string x)
{
// Use whatever format you want here...
base.WriteLine(string.Format("{0:r}: {1}", DateTime.UtcNow, x));
}
Как отмечено в комментариях, это заканчивается с дублированием даты для TraceInformation
, потому что это дважды вызывает Write
. Определенно лучше использовать "правильную" структуру ведения журнала.
Вы можете написать свой собственный подкласс TextWriterTraceListener, который переопределяет методы WriteLine, украшает строку, а затем передает декорированную строку реализации базового класса для фактического вывода.
Рассмотрите возможность использования Блок приложения ведения журнала
Не совсем ответ на ваш вопрос, но рассматривали ли вы возможность просто использовать log4Net ?
Вы можете настроить его для добавления времени и т. Д., А также большого количества других полезные функции.
Или просто добавьте DateTime в качестве параметра traceOutputOption.