Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Исключающее объединение коллекций, LINQ / 10 сообщений из 10, страница 1 из 1
01.03.2010, 10:50
    #36494082
VitaliyBoris
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключающее объединение коллекций, LINQ
Доброго всем времени :) Подскажите, как с помощью LINQ получить исключающее объединение двух коллекций. Сравнивать нужно только Title и Published.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
public class Item
{
   public int Id{get; set;}
   public string Title {get; set;}
   public string Desc {get; set;}
   public DateTime Published {get; set;}
}

IEnumerable<Item> items1, items2;

Заранее спасибо.
...
Рейтинг: 0 / 0
01.03.2010, 11:02
    #36494123
bured
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключающее объединение коллекций, LINQ
Переопределить Equals для класса и воспользоваться операцией Except
...
Рейтинг: 0 / 0
01.03.2010, 11:19
    #36494171
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключающее объединение коллекций, LINQ
IEqualityComparer
...
Рейтинг: 0 / 0
01.03.2010, 11:40
    #36494235
bured
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключающее объединение коллекций, LINQ
Код: 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.
41.
42.
43.
44.
45.
46.
47.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace EqTest
{
    public class Item
    {
        public int Id { get; set; }
        public string Title { get; set; }
        public string Desc { get; set; }
        public DateTime Published { get; set; }

        public Item()
        { }

        public Item(int id, string title, string desc, DateTime published)
        {
            this.Id = id;
            this.Title = title;
            this.Desc = desc;
            this.Published = published;
        }

        public override bool Equals(System.Object obj)
        {
            // If parameter is null return false.
            if (obj == null)
            {
                return false;
            }

            // If parameter cannot be cast to Point return false.
            Item item = obj as Item;
            if ((System.Object)item == null)
            {
                return false;
            }

            // Return true if the fields match:
            return (Title == item.Title) && (Desc == item.Title);
        }


    }
}
Код: 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.
using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace EqTest
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            List<Item> items1 = new List<Item>(); 
            List<Item> items2 = new List<Item>();
            items1.Add(new Item(1, "Professional ASP.NET 3.5", "McDonald", DateTime.Parse("01.01.2009")));
            items2.Add(new Item(1, "Beginner ASP.NET 3.5", "McDonald", DateTime.Parse("01.01.2009")));
            items2.Add(new Item(2, "Professional ASP.NET 3.5", "McDonald", DateTime.Parse("01.01.2009")));
            items2.Add(new Item(2, "Professional ASP.NET 3.5", "Esposito", DateTime.Parse("01.01.2009")));
            IEnumerable<Item> result = items2.Except(items1);
            GridView1.DataSource = result.ToList();
            DataBind();
        }
    }
}
...
Рейтинг: 0 / 0
01.03.2010, 11:53
    #36494276
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключающее объединение коллекций, LINQ
1. Андрей, про Object.GetHashCode() что-нибудь слышали?
2. Зачем столько лишнего кода в Equals?

Код: plaintext
1.
2.
3.
4.
public override bool Equals(object obj)
{
    Item item = obj as Item;
    return obj as Item != null ? Title == item.Title && Desc == item.Title : false;
}
...
Рейтинг: 0 / 0
01.03.2010, 12:01
    #36494307
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключающее объединение коллекций, LINQ
3. Андрей, зачем "поганить" класс, если для этого есть IEqualityComparer?
4. Ведь, в задачах в разрезе класса может быть ни один такой компаринг с Title и Published, может быть и другая логика по другим полям.
...
Рейтинг: 0 / 0
01.03.2010, 23:47
    #36495905
bured
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключающее объединение коллекций, LINQ
Это всё не принципиально.
...
Рейтинг: 0 / 0
02.03.2010, 00:01
    #36495917
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключающее объединение коллекций, LINQ
МСУ1. Андрей, про Object.GetHashCode() что-нибудь слышали?

буредЭто всё не принципиально.

Букварь
Реализация метода Equals
1п. Для правильной работы типа в таблице хеширования следует переопределить метод GetHashCode.

Это тоже не принципиально? ;)
...
Рейтинг: 0 / 0
02.03.2010, 01:16
    #36495958
bured
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключающее объединение коллекций, LINQ
МСУ,

я в курсе. 8-)
...
Рейтинг: 0 / 0
02.03.2010, 13:29
    #36496909
VitaliyBoris
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключающее объединение коллекций, LINQ
Всем спасибо.
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Исключающее объединение коллекций, LINQ / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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