2015-02-06 2 views
0

у меня есть этот определенный ключ в моем словаре:Distinct некоторых ключевых объектов

public class KKey 
{ 
    public string Name { get; set; } 
    public Guid Guid { get; set; } 
} 

Dictionary<KKey, string> myDictionary = new Dictionary<KKey, string>(); 

проблема была каждый раз, когда я произвожу новый Guid, это условие не работал бы:

if (false == myDictionary.TryGetValue(key, out keyobj)) 

, потому что ключ Guid был новый ..

Теперь мой вопрос: как я могу сделать условие, чтобы проверить, было ли добавлено Kkey.Name, а затем добавить?

+0

Мне любопытно, что вы храните в строковой части словаря? – Jessica

+2

Вам нужно сделать 'KKey' реализацию' IEquatable '. Вы также можете сделать его «struct», и свойства будут доступны только для чтения после построения, поскольку изменение словарных клавиш - это то, что вы действительно не хотите делать. – Jon

+0

@ Джессика, просто описание имени – Elegiac

ответ

1

Вам необходимо либо создать собственный компаратор или ваш класс коррекции Equals и GetHashCode

Вариант 1: Comparer

sealed class NameEqualityComparer : IEqualityComparer<KKey> 
{ 
    public bool Equals(KKey x, KKey y) 
    { 
     return string.Equals(x.Name, y.Name); 
    } 

    public int GetHashCode(KKey obj) 
    { 
     return (obj.Name != null ? obj.Name.GetHashCode() : 0); 
    } 
} 

Dictionary<KKey, string> myDictionary = new Dictionary<KKey, string>(new NameEqualityComparer()); 

Вариант 2: Override

public class KKey : IEquatable<KKey> 
{ 
    public string Name { get; set; } 
    public Guid Guid { get; set; } 

    public bool Equals(KKey other) 
    { 
     if (ReferenceEquals(null, other)) return false; 
     if (ReferenceEquals(this, other)) return true; 
     return string.Equals(Name, other.Name); 
    } 

    public override bool Equals(object obj) 
    { 
     return Equals(obj as KKey); 
    } 

    public override int GetHashCode() 
    { 
     return (Name != null ? Name.GetHashCode() : 0); 
    } 
} 

Dictionary<KKey, string> myDictionary = new Dictionary<KKey, string>(); 
+0

@Elegiac вы могли бы использовать этот подход, чтобы сделать имя нечувствительным к регистру, но я думаю, что Guid лучше всего вводить значение вместо ключа, так как оно не является частью идентификатора для ключа. – Jessica

0

может также быть

bool alreadyAdded = keywordList.Any(n => n.Key.Name == name); 
if (!alreadyAdded) { } 
+0

Хотя этот пример кода может ответить на вопрос, было бы предпочтительнее включить какое-то существенное объяснение в ваш ответ. В настоящее время этот ответ добавляет немного никакой ценности для будущих читателей. –

Смежные вопросы