используя HashSet удаление дубликатов - PullRequest
0 голосов
/ 20 сентября 2011

как я могу удалить дубликаты с помощью HashSet или, если у вас есть идея получше, пожалуйста, дайте мне знать, но пока что это то, что я делаю ...

я пытаюсь удалить дубликаты, а код нижея использую ....

HashSet<DropDownListClass> hashSetTopics = new HashSet<DropDownListClass>(); 

foreach (XmlNode node in topicNodes)
{
   string topicId = node.Attributes["TopicId"].Value;
   string topicName = node.Attributes["TopicName"].Value;
   hashSetTopics.Add(new DropDownListClass { Id = topicId, Name = topicName }); 
} 

the below code does removes the duplicates but the problem with the below is that i need a way to attach the id with name... at the end i am binding to dropdownlist.

HashSet<string> hashSetTopics1 = new HashSet<string>(); 

foreach (XmlNode node in topicNodes)
{
   string topicId = node.Attributes["TopicId"].Value;
   string topicName = node.Attributes["TopicName"].Value;
   hashSetTopics1.Add(topicName }); 
} 

DropDownList1.DataSource = hashSetTopics; /hashSetTopics1
DropDownList1.DataBind();


 public class DropDownListClass
    {
        public string Id { get; set; }
        public string Name { get; set; } 
    }

Ответы [ 4 ]

3 голосов
/ 20 сентября 2011

Есть несколько способов сделать это.

Один из способов - переопределить Equals метод вашего DropDownListClass.См. Рекомендации по переопределению равных и оператора == .

Другой вариант - создать производный класс EqualityComparer, который выполняет сравнение:

public DropDownComparer : EqualityComparer<DropDownListClass>
{
    public override bool Equals(DropDownListClass i1, DropDownListClass i2)
    {
        bool rslt = (i1.Id == i2.Id) && (i1.Name == i2.Name);
    }

    public override int GetHashCode(DropDownListClass x)
    {
        return x.Id.GetHashCode() ^ x.Id.GetHashCode();
    }
}

И когда высоздайте свой HashSet:

DropDownComparer comparer = new DropDownComparer();
HashSet<DropDownListClass> hashSetTopics = new HashSet<DropDownListClass>(comparer); 

, который сообщает коду HashSet: «используйте мою пользовательскую функцию сравнения для сравнения элементов».Ваш первый цикл должен работать сейчас.

2 голосов
/ 20 сентября 2011

IComparible интерфейс (IEqualityComparer): http://msdn.microsoft.com/en-us/library/system.icomparable.aspx

Вы можете использовать этот код для проекции общего равенства

public sealed class ProjectionComparer<TValue, TProjection> : IEqualityComparer<TValue>
    {
        readonly Func<TValue, TProjection> _projection;

        public ProjectionComparer(Func<TValue, TProjection> projection)
        {
            projection.AssertParameterNotNull("projection");
            _projection = projection;
        }

        bool IEqualityComparer<TValue>.Equals(TValue x, TValue y)
        {
            var projectedX = _projection(x);
            var projectedY = _projection(y);

            return projectedX.Equals(projectedY);
        }

        int IEqualityComparer<TValue>.GetHashCode(TValue obj)
        {
            var projectedObj = _projection(obj);
            return projectedObj.GetHashCode();
        }
    }
1 голос
/ 20 сентября 2011
IList<ListItem> dropDownListItems = new List<ListItem>();

foreach (XmlNode node in topicNodes)
{
   string topicId = node.Attributes["TopicId"].Value;
   string topicName = node.Attributes["TopicName"].Value;
   dropDownListItems.Add(new ListItem(topicName, topicId)); 
} 

DropDownList1.DataSource = dropDownListItems.Distinct(); 
DropDownList1.DataBind();

EDIT Я думаю, что вы получаете ошибки в своем HashSet, потому что ваш класс DropDownListClass не реализует IComparable

Ниже приведен пример того, как дубликаты данных попадают в HashSet. Класс MyObject, вероятно, должен реализовывать интерфейс IComparible.

public void Main()
{
    HashSet<MyObject> myObjects = new HashSet<MyObject>();
    bool success = myObjects.Add(new MyObject{ID = 1});
    success.Dump("First"); //Returns true

    success = myObjects.Add(new MyObject{ID = 1});

    success.Dump("Second"); //Returns true should have been false
}

// Define other methods and classes here
public class MyObject
{
    public int ID {get; set;}
}

Вы даже можете вызывать Distinct () из вашего исходного объекта HashSet, но это просто скрывает, что он сломан.

0 голосов
/ 20 сентября 2011

Попробуйте использовать словарь - вы получаете уникальность, основанную на ключе, и значение может быть любым.

Dictionary<string, DropDownListClass> topics = new Dictionary<string, DropDownListClass>(); 

foreach (XmlNode node in topicNodes)
{
   string topicId = node.Attributes["TopicId"].Value;
   string topicName = node.Attributes["TopicName"].Value;
   topics[topicName] = new DropDownListClass { Id = topicId, Name = topicName }; 
} 

DropDownList1.DisplayMember = "Name";
DropDownList1.ValueMember = "Id";
DropDownList1.DataSource = topics.Values;
DropDownList1.DataBind();

Вероятно, вы также можете реализовать метод Equals в DropDownListClass, который сравнивается на основе свойства Id.

Наконец, DropDownListClass может иметь гораздо лучшее имя, например Topic.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...