Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / distinct из списка / 3 сообщений из 3, страница 1 из 1
12.01.2010, 11:03
    #36404781
Sv219
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
distinct из списка
имеется некий список List<Metadata> из него надо получить все различные записи. Сделал следующее:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
        var distinctMetadataList = metadataList.Distinct(new MetadataComparer());

        private class MetadataComparer : IEqualityComparer<Metadata>
        {
            public bool Equals(Metadata x, Metadata y)
            {
                if ((x.Isbn == y.Isbn || x.Ebook.PrintIsbn == y.Ebook.PrintIsbn)
                    && x.CreditorId == y.CreditorId)
                {
                    return true;
                }

                return false;
            }

            public int GetHashCode(Metadata obj)
            {
                string z = obj.Isbn + obj.Ebook.PrintIsbn + obj.CreditorId;
                return z.GetHashCode();
            }
        }
НО здесь меня смущает строка string z = obj.Isbn + obj.Ebook.PrintIsbn + obj.CreditorId; в методе public int GetHashCode(Metadata obj)... изза нее не работает.

Как правильно поступить в моем случае?
...
Рейтинг: 0 / 0
13.01.2010, 09:55
    #36406788
WYPMAH
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
distinct из списка
Sv219
гляньте такой пример, мб найдете свою ошибку:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
        public class SomeClass
        {
            public int ID { get; set; }
            public string Value { get; set; }
        }

        public class SomeClassComparer : IEqualityComparer<SomeClass>
        {
            #region IEqualityComparer<SomeClass> Members

            public bool Equals(SomeClass x, SomeClass y)
            {
                return (x.ID.Equals(y.ID) && x.Value.Equals(y.Value));
            }

            public int GetHashCode(SomeClass obj)
            {
                object temp = obj.ID + obj.Value;
                return temp.GetHashCode();
            }

            #endregion
        }

        static void Main(string[] args)
        {
            List<SomeClass> list = new List<SomeClass>();
            list.Add(new SomeClass() { ID = 1, Value = "qwe" });
            list.Add(new SomeClass() { ID = 2, Value = "asd" });
            list.Add(new SomeClass() { ID = 3, Value = "zxc" });
            list.Add(new SomeClass() { ID = 4, Value = "qwe" });
            list.Add(new SomeClass() { ID = 1, Value = "qwe" });

            Console.WriteLine("Original list:");
            list.ForEach(a => Console.WriteLine(string.Format("{0} - {1}", a.ID, a.Value)));

            Console.WriteLine(Environment.NewLine + "Distinct list:");
            list.Distinct(new SomeClassComparer()).ToList().ForEach(a => Console.WriteLine(string.Format("{0} - {1}", a.ID, a.Value)));

            Console.ReadKey();
        }

_______________
AnimeBay - аниме магазин, который Вас не разочарует.
...
Рейтинг: 0 / 0
13.01.2010, 20:59
    #36408493
зы
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
distinct из списка
У него проблема в том что условие Equals содержит неоднозначность, "или или". Хэш код неоднозначности посчитать нельзя. Как вариант можно вернуть из GetHashCode() константу. Это немного увеличит затраты но должно решить проблему.
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / distinct из списка / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]