1

2 つの文字列プロパティ、名前、およびバージョン文字列 (例: "1.0.0") を含むオブジェクト AppDetail があります。

同じ名前で異なるバージョン文字列の重複を含む List< AppDetail > が与えられた場合、一意の名前と最新のバージョンを持つ List を作成するにはどうすればよいですか?

たとえば、初期リストのこれら 2 つの項目から

"name", "1.0.1"
"name", "1.1.0"

固有のアイテム リストには、2 番目のアイテムのみが含まれるようにします。これは、バージョンが最も高いためです。

バージョンを比較するには、Version オブジェクトを作成する IComparer を作成し、次に version.CompareTo(version) メソッドを使用する必要があります。しかし、List.Distinct オーバーロードは IComparer ではなく IEqualityComparer のみを受け入れるため、これは役に立ちません。

何かご意見は?ありがとう

4

3 に答える 3

2

2 つの項目が異なるかどうかを判断するために、ある項目が別の項目に先行するかどうか (またはその逆) を知る必要List.Distinct()がないため、 を受け入れないのは理にかなっています。これがインターフェイスの目的です。むしろ、必要なのは 2 つの項目が等しいかどうかを知ることだけであり、それがまさに存在する理由です。IComparerIComparerIEqualityComparer

ただし、どちらも実装する必要はありません。最初にすべてのアイテムを名前でグループ化し、次に各グループから最大のバージョン番号のみを選択することにより、適切なアイテムを選択するクエリを作成できます。

var namesWithHighestVersion = 
    appDetailList
        .GroupBy(x => x.Name)
        .Select(x => new AppDetail { 
                         Name = x.Key,
                         Version = x.Max(x => new Version(x.Version)).ToString()
                        })
        .ToList();

これにより、古いリストが更新されるのではなく、新しいリストが作成されることに注意してください。

Versionまた、元の型で文字列の代わりに , を使用することで、すべてをいくらか単純化できます。

于 2012-07-09T22:43:53.403 に答える
1

pretty sql で示される単純なクエリ:

var aDetail  =  from a in appdetail
                group a by a.name into aGroup
                orderby a.version descending
                select new 
                    {name = aGroup.name, 
                     version = aGroup.Max(version)}.ToList();

グループ化により、クエリが自然に区別されます

ここにある次のプロジェクトを含め、MaxBy を以前に使用したことについては申し訳ありませ

于 2012-07-09T22:43:42.663 に答える
1

このソリューションは dlev の回答に似ていますが、同じ値で新しいインスタンスを作成するのではなく、最も高いバージョンのインスタンスを返します。

var namesWithHighestVersion = 
    appDetailList
        .GroupBy(a => a.Name)
        .Select(g => g.OrderByDescending(a => a.Version).First())
        .ToList();
于 2012-07-09T23:16:13.997 に答える