2017-03-17 1 views
-3

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.

+1

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

+1

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

+0

_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

Répondre

0

Depuis le dictionary peut être utilisé pour correspondre par clé qui est pas si flexible, je vous suggère d'utiliser la liste normale et LINQ:

class Item 
{ 
    int a; 
    int b; 
    int c; 
    string s; 
    List<Day> days; 
} 

class SearchParams 
{ 
    int a; 
    int b; 
    int c; 
    string s; 
    Day d1; 
    Day d2; 
} 

// Populate items 
var items = new List<Item>(); 
items.Add(...); 

// Search items 
var par = new SearchParams { ... }; 
var matches = items.Where(x=> 
    x.a == par.a && 
    x.b == par.b && 
    x.c == par.c && 
    x.s == par.s && 
    x.days.Any(d >= par.d1 && d <= par.d2) 
); 
+0

Merci pour la suggestion. Cependant, pourriez-vous expliquer comment cela tente d'améliorer la complexité du temps de recherche. Quand les params ont été corrigés, le dictionnaire faisait un excellent travail en gardant la recherche O (1). Cela va réduire drastiquement la vitesse de recherche –

+1

@SrivathsaHarishVenkataramana oui - les recherches de gamme sont beaucoup plus dures que la recherche d'article simple ... Sauf si vous voulez investir beaucoup dans l'indexation correcte, la recherche linéaire est facile à prouver une alternative fiable. –

+0

Vous attendez seulement un match? S'il vous plaît, soyez plus précis, montrez-nous un exemple afin que nous n'ayons pas à spéculer sur votre intention ... – Dusan