GroupBy для нескольких свойств сложного типаC#

Место общения программистов C#
Anonymous
GroupBy для нескольких свойств сложного типа

Сообщение Anonymous »

Я написал оператор GroupBy следующим образом:

Код: Выделить всё

var aggregated = sitesWithLive
.GroupBy(s => new {s.SiteRefNum, s.SiteRefName, s.Address})
.Select(g =>
new Site
{
SiteRefNum = g.Key.SiteRefNum,
SiteRefName = g.Key.SiteRefName,
Address = g.Key.Address,
ContractLive = g.Max(x => x.ContractLive)
});
В группе находится адрес, который является сложным типом:

Код: Выделить всё

public class Address
{
public string Name { get; set; }
public string Line1 { get; set; }
public string Line2 { get; set; }
public string Line3 { get; set; }
public string Line4 { get; set; }
public string PostCode { get; set; }

public bool IsEmpty()
{
return GetType().GetProperties()
.Where(a => a.GetValue(this) is string)
.Select(a => (string)a.GetValue(this))
.All(string.IsNullOrEmpty);
}

public override string ToString()
{
var addr = Line1 + "," + Line2 + "," + Line3 + "," + Line4 + "," + PostCode;
var address = Regex.Replace(addr, @"^,+|,{2,}|,(?=[\w.])", ", ");
return address;
}
}
Однако это неправильно группирует по адресу, вместо этого возвращается отдельная группа для каждого элемента.

Насколько я понимаю, для группировки по сложному типу необходимо предоставить IEqualityComparer, поэтому я создал следующее:

Код: Выделить всё

public class AddressComparer : IEqualityComparer
{
public bool Equals(Address x, Address y)
{
return x.ToString() == y.ToString();
}

public int GetHashCode(Address obj)
{
return 1;
}
}
и предоставил его следующим образом (подмножество приведенного выше):

Код: Выделить всё

var aggregated = sitesWithLive.GroupBy(s => new {s.SiteRefNum, s.SiteRefName, s.Address}, new AddressComparer())
...
Однако это дает мне


Аргументы типа не могут быть выведены из использования. Попробуйте указать
аргументы типа явно.


Я не знаю, что делать дальше, ведь такая группировка не должна быть слишком сложной?

Вернуться в «C#»