1

複雑なオブジェクトの2つのリストを考えてみましょう:

        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; }
        }
    }

Union および Intersect 操作が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 }),
            };

私が試したこと

比較された 2 つの項目が等しい場合に 2 つを拡張およびマージするfirst.Union(second, new EqualityComparer())場所を使用してみましたが、少しハッキーに思えました。EqualityComparerIEqualityComparer<Record>SecondaryIdentifiers

これを行うためのよりエレガントな方法はありますか?

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 に答える