#c# #dictionary
Вопрос:
У меня есть это
Dictionarylt;(DateTime from, DateTime to), HashSetlt;stringgt;gt; uniquelyChangedPeriods = new();
в котором я храню уникальную строку за определенный период времени
такой бывший.
между (с: 2020-01-01T00:00:00Z, до:2022-01-01T00:00:00Z) Я мог бы хранить такие строки, как {«Привет»,»Адрес», «Что-то»} Допустим, я затем хочу добавить изменение, зарегистрированное в (2020-01-01T00:00:00Z, 2021-01-01T00:00:00Z) {«Привет»,»Адрес», «Что-то 2»}
но поскольку (2020-01-01T00:00:00Z,2021-01-01T00:00:00Z) включен в (с: 2020-01-01T00:00:00Z , до:2022-01-01T00:00:00Z), я хочу включить «Что-то 2» в запись (с: 2020-01-01T00:00:00Z , до:2022-01-01T00:00:00Z) и не создавать отдельную запись в словаре за это… как легко выполнить эту проверку перекрытия и убедиться, что она включена в перекрывающиеся временные рамки?
Комментарии:
1. Вы хотите (2020, 2021) перезаписать (2020, 2022)?
2. @LukaSamkharadze Я хочу иметь возможность выбрать ключ, который перекрывается с заданным периодом изменения.
3. Почему вы используете словарь вместо IEnumerable
4. Или почему вы используете DateTime, если используете их как int?
5. Так как я хочу только уникальные периоды изменений и как можно больше..
Ответ №1:
Вот один из способов, которым вы могли бы это сделать:
Dictionarylt;(DateTime from, DateTime to), HashSetlt;stringgt;gt; uniquelyChangedPeriods = new(); var ((from, to), addData) = ((new DateTime(2020, 1, 1), new DateTime(2021, 1, 1)), new[]{ "test" }); var existing = uniquelyChangedPeriods.FirstOrDefault(x =gt; x.Key.from lt;= from amp;amp; x.Key.to gt;= to); if (existing.Value != null) { foreach (var a in addData) existing.Value.Add(a); } else { var set = new HashSetlt;stringgt;(); foreach (var a in addData) set.Add(a); uniquelyChangedPeriods.Add((from, to), set); }
Однако вы, возможно, захотите пересмотреть свой дизайн и подход здесь. Использование словаря таким образом будет работать, но может оказаться трудным в дальнейшем.
Редактировать:
Например, нынешний подход не учитывает потенциальный случай, когда новый период полностью или частично перекрывает существующий и выходит за пределы этого существующего. Чтобы лучше справиться с этим случаем, вы можете создать класс, содержащий данные, который имеет начальные и конечные свойства; затем вы можете изменить начальные и конечные записи (т. Е. расширяйте их), как вам заблагорассудится. Списокlt;gt; может содержать существующие записи.
Комментарии:
1. что, если все наоборот, тот, у которого наименьший промежуток времени, сохраняется, а больший включается позже?
2. Как я уже упоминал, этот вариант использования не поддерживается этим кодом, он просто демонстрирует, как вы можете это сделать. В случае увеличения периода вам придется удалить существующий из словаря, объединить новые и существующие данные и добавить новую запись.
3. Я предполагаю, что ваша идея может сработать, хотя, возможно, будет немного неэффективно выполнять проверку каждый раз, когда что — то нужно вставлять..
4. Использование некоторых операторов LINQ для определения наличия подходящего экземпляра класса в списке приведет к некоторым накладным расходам. Но так же будет работать и со словарем. Однако эти накладные расходы будут очень небольшими, и вы можете решить не использовать LINQ для повышения производительности. Ваш вариант использования должен быть довольно конкретным (т. Е. очень много вставок), чтобы это имело реальное значение.
5. это также происходит во время многих вставок, с которыми я сталкиваюсь, для одной вставки я в порядке.