1

考虑两个复杂对象的列表:

        var first = new List<Record>
            {
                new Record(1, new List<int> { 2, 3 }),
                new Record(4, new List<int> { 5, 6 })
            };

        var second = new List<Record>
            {
                new Record(1, new List<int> { 4 })
            };

其中 aRecord定义如下。没什么花哨的,只是一个Id包含 SecondaryIdentifiers.

    public class Record
    {
        private readonly IList<int> _secondaryIdentifiers;
        private readonly int _id;

        public Record(int id, IList<int> secondaryIdentifiers)
        {
            _id = id;
            _secondaryIdentifiers = secondaryIdentifiers;
        }

        public IList<int> SecondaryIdentifiers
        {
            get { return _secondaryIdentifiers; }
        }

        public int Id
        {
            get { return _id; }
        }
    }

我怎样才能联合/感兴趣,以便联合和相交操作合并SecondaryIdentifiers。

        var union = first.Union(second);
        var intersect = first.Intersect(second);

联盟将

            {
                new Record(1, new List<int> { 2, 3 , 4 }),
                new Record(4, new List<int> { 5, 6 })
            };

相交将是

            {
                new Record(1, new List<int> { 2, 3 , 4 }),
            };

我试过的

如果比较的两个项目相等,我尝试使用first.Union(second, new EqualityComparer())whereEqualityComparer扩展IEqualityComparer<Record>和合并两者SecondaryIdentifiers,但对我来说似乎有点 hacky。

有没有更优雅的方式来做到这一点?

4

2 回答 2

2

有没有更优雅的方法来做到这一点

它是基于意见的,但我会这样做:

var union = first.Concat(second)
            .GroupBy(x => x.Id)
            .Select(g => g.SelectMany(y => y.SecondaryIdentifiers).ToList())
            .ToList();


var intersect = first.Concat(second)
                .GroupBy(x => x.Id)
                .Where(x => x.Count() > 1)
                .Select(g => g.SelectMany(y => y.SecondaryIdentifiers).ToList())
                .ToList();

PS:随意删除.ToList()s 进行懒惰评估。

于 2013-09-28T22:36:37.003 回答
0

这应该适用于工会部分:

from a in first
join b in second on a.Id equals b.Id into rGroup
let ids = a.SecondaryIdentifiers.Union(rGroup.SelectMany(r => r.SecondaryIdentifiers))
select new Record(a.Id, ids.ToList())

和相交:

from a in first
join b in second on a.Id equals b.Id
select new Record(a.Id, a.SecondaryIdentifiers.Union(b.SecondaryIdentifiers).ToList())
于 2013-09-28T23:00:46.100 回答