MISE À JOUR CONCIS QUESTIONrecherche efficace sur la base si une valeur datetime se situe dans une gamme
J'ai un objet qui contient une liste de valeurs DateTime. Ceci est la liste des vacances et aussi les heures de travail dans une journée.
Item.cs
class Item
{
public int SourceId { get; set; }
public int DestinationId { get; set; }
public int ChannelId { get; set; }
public string Username { get; set; }
public List<DateTime> Holidays { get; set; }
}
Si non pour les vacances, nous pouvons tenir la liste des éléments dans un dictionnaire avec le Tuple comme la clé.
Exigences
Il y aura un élément qui correspond aux critères (parce qu'il ya un élément par défaut pour gérer le cas où aucun élément correspondant)
Les propriétés sont destinées à changer de temps puis
1) Est-il possible d'obtenir un code de hachage pour un tel objet, y compris la propriété Vacances.
2) Dans le cas contraire un dictionnaire, comment concevoir une structure de données pour une telle recherche avec une complexité temporelle optimale
originale Incertain post
Je mis en place un dictionnaire avec un tuple comme la clé, il a travaillé jusqu'à maintenant très bien.
clé Dictionnaire existant
Tuple<int, int, int, string>
recherche existante Méthode
var item = default(item);
_dictinary.TryGetValue(new Tuple(1,1,1,""), out item);
return item;
parce que les paramètres de recherche ont été fixés.
Toutefois, une nouvelle exigence est apparue, de sorte que les éléments de la ligne sont dynamiques, c'est-à-dire que les paramètres de recherche ont un nombre variable. J'ai essayé de garder le nombre fixe en supposant qu'il y aura toujours un maximum de paramètres de recherche, mais ensuite je frappe le mur quand un autre paramètre de recherche de type date date est requis. Cela signifie que je ne peux pas avoir un dictionnaire comme structure de données sous-jacente. Par conséquent, j'avais besoin de savoir quel type de structure de données serait considéré pour maintenir la recherche aussi efficace que possible quand il y a plusieurs critères avec quelque chose comme la plage de dates. Pour être complet, permettez-moi de dire que le nouveau paramètre de recherche est une plage de dates appelée Holiday. à-dire que je dois correspondre si aujourd'hui est dans la plage de dates de cette vacances, y compris d'autres paramters
Holiday.cs
public class Holiday
{
public List<Day> Days{ get; set; }
}
où Day est une enveloppe de DateTime désignant un jour en un an.
Résumé Combinaison de SourceId (int), destinationId (int), ChannelId (int), Nom d'utilisateur (int), (IsTodayHoliday (vacances-DateRanges)) devrait trouver un des éléments de la collection unique
Je ne peux pas utiliser un hachage d'un objet car l'objet du paramètre de recherche est mutable avec des plages de dates, et les plages ne sont pas forcément contiguës, du moins je ne sais pas comment obtenir un hachage pour un tel objet
Je comprends parfaitement qu'un algorithme de correspondance est requis et comme je l'ai mentionné plus haut, j'ai absolument besoin de changer ma structure de données et le dictionnaire ne convient pas. Ma question est très spécifique à la conception de la structure de données pour améliorer la complexité de la recherche.
Pouvez-vous s'il vous plaît donner un exemple des deux points de données que vous sont en train de chercher et le type de requête est faite pour les rechercher? – Sam
J'ai le sentiment que vous n'utilisez pas le dictionnaire comme structure principale utilisée pour votre recherche. Vous avez probablement besoin d'utiliser 'SearchParams' comme entrée pour le prédicat de correspondance personnalisé de vos objets (au lieu d'utiliser la correspondance par dictionnaire) – Dusan
_la conception de la structure de données pour améliorer la complexité de la recherche_ vouliez-vous dire ** efficacité ** au lieu de ** complexité **? – Dusan