0

いくつかのレコードを持つデータ行のnewLinksのコレクションがあります。これがテーブル構造です

LinkSysId | LinkId | Col1 | Col2
1           1        str    str1
2           1        str5   str4 
3           2        str2   str3
4           2        str6   str7

linqクエリを作成します。これにより、コレクションが繰り返され、上位1つの個別のLinkIdレコードのみが残ります。

LinkSysId | LinkId | Col1 | Col2
1           1        str    str 
3           2        str3   str3

このように作ってみました

newLinks.RemoveAll(rowComp => newLinks.Any(rowDel => 
                   rowComp["linkId"].ToString() == rowDel["linkId"].ToString() 
                   &&  rowComp["linkSysId"].ToString() != rowDel["linkSysId"].ToString()));

しかし、それはコレクションからすべてのアイテムを削除しますか?助けてくれてありがとう

4

3 に答える 3

3

探しているものであるDistinctBy()を実装するLINQ拡張ライブラリがあります。ただし、この小さなスニペットは、同じアイテムがすでに追加されている場合、ハッシュセットのAdd()メソッドがfalseを返すという事実を利用しています。

var foundIds = new HashSet<int>();
var FirstLinkId = newLinks.Where(row=>foundIds.Add(row.LinkId)).ToList();
于 2013-03-21T13:34:39.397 に答える
1

「新しい作成」アプローチ:

DataTable keepTheseRows = table.AsEnumerable()
    .GroupBy(r => r.Field<int>("LinkId"))
    .Select(g => g.First())  // takes the first of each group arbitrarily
    .CopyToDataTable();
于 2013-03-21T13:27:00.663 に答える
1

Tormodが言うように、最良のアプローチはDistinctBy()実装を使用することです。

(特に、Tormodの実装を見ると、以下のDistinctByImpl()メソッドと実質的に同じであることがわかります。したがって、この回答は彼の拡張であると見なす必要があります。)

DistinctBy()を使用すると、ソリューションは次のように単純になります。

var uniques = list.DistinctBy(item => item.LinkId);

の優れた実装は、NuGetでも利用DistinctBy()できるJonSkeetMoreLinqライブラリにあります。

例として、MoreLinqのDistinctBy()実装のコピーを使用した実装を次に示します。ただし、このコードは使用しないでください。NuGetを使用して、コメント付きの元のコードをダウンロードしてください。

using System;
using System.Linq;
using System.Collections.Generic;

namespace Demo
{
    public static class Program
    {
        public static void Main(string[] args)
        {
            List<Test> list = new List<Test>
            {
                new Test(1, 1),
                new Test(2, 1),
                new Test(3, 2),
                new Test(4, 2)
            };

            var uniques = list.DistinctBy(item => item.LinkId);

            foreach (var item in uniques)
            {
                Console.WriteLine(item);
            }
        }
    }

    public class Test
    {
        public Test(int linkSysId, int linkId)
        {
            LinkSysId = linkSysId;
            LinkId = linkId;
        }

        public override string ToString()
        {
            return string.Format("LinkSysId = {0}, LinkId = {1}", LinkSysId, LinkId);
        }

        public int LinkSysId;
        public int LinkId;
    }

    static class EnumerableExt
    {
        public static IEnumerable<TSource> DistinctBy<TSource, TKey>
            (this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
        {
            return source.DistinctBy(keySelector, null);
        }

        public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source,
            Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer)
        {
            if (source == null) throw new ArgumentNullException("source");
            if (keySelector == null) throw new ArgumentNullException("keySelector");
            return DistinctByImpl(source, keySelector, comparer);
        }

        private static IEnumerable<TSource> DistinctByImpl<TSource, TKey>(IEnumerable<TSource> source,
            Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer)
        {
            var knownKeys = new HashSet<TKey>(comparer);
            return source.Where(element => knownKeys.Add(keySelector(element)));
        }
    }
}
于 2013-03-21T13:56:25.250 に答える