Я думаю, что ответ, который я выбрал изначально, все еще является лучшим ответом для этого конкретного случая, я недавно оказался в другой подобной ситуации, где у меня было 2 IEnumerable<>
объектов, которые я хотел преобразовать в словарь и объединить вместе таким же образом, поэтому я подумал, что добавлю это решение, чтобы помочь кому-то в будущем. Вместо того, чтобы преобразовывать оба словаря и использовать метод в выбранном ответе, я нашел новый подход.
Я на самом деле разместил первоначальное решение в SE-CodeReview, и у меня действительно было предложение уточнить его. Вот последний код, который я использовал:
public Dictionary<String, Foo> Merge(XElement element1, XElement element2)
{
IEnumerable<Foo> firstFoos = GetXmlData(element1); // parse 1st set from XML
IEnumerable<Foo> secondFoos = GetXmlData(element2); // parse 2nd set from XML
var result = firstFoos.Union(secondFoos).ToDictionary(k=>k.Name, v=>v);
return result;
}
public class Foo
{
public String Name { get; }
// other Properties and Methods
// .
// .
// .
public override Boolean Equals(Object obj)
{
if (obj is Foo)
{
return this.Name == ((Foo)obj).Name;
}
return false;
}
}
Ключ к этому Foo
должен переопределить Equals()
, чтобы определить, какие Foo
объекты могут считаться дублирующими, и члены, которые определяют, какие объекты являются дубликатами, также должны быть ключом Dictionary<>
(в данном случае Name
)
Если вы не можете переопределить Equals()
в Foo
, тогда другой вариант - использовать Concat()
и GroupBy()
вместо Union()
public Dictionary<String, Foo> Merge(XElement element1, XElement element2)
{
IEnumerable<Foo> firstFoos = GetXmlData(element1); // parse 1st set from XML
IEnumerable<Foo> secondFoos = GetXmlData(element2); // parse 2nd set from XML
var result = firstFoos.Concat(secondFoos)
.GroupBy(foo => foo.Name)
.Select(grp => grp.First())
.ToDictionary(k=>k.Name, v=>v);
return result;
}