3

多数のファイルに関する詳細のリストがあります。このリストには、ファイルID、最終変更日、およびファイルパスが含まれています。問題は、古いバージョンのファイルが重複していて、ファイルパスが異なる場合があることです。ファイルパスに関係なく、ファイルの最新バージョンのみを保存したい。そこで、順序付きリストを反復処理し、IDが一意であるかどうかを確認し、一意である場合は新しい一意のリストに格納されるループを作成しました。

 var ordered = list.OrderBy(x => x.ID).ThenByDescending(x => x.LastModifiedDate);

            List<Item> unique = new List<Item>();

            string curAssetId = null;

            foreach (Item result in ordered)
            {
                if (!result.ID.Equals(curAssetId))
                {
                    unique.Add(result);
                    curAssetId = result.ID;
                }
            }

ただし、これでもDBへの複製が許可されており、このコードが期待どおりに機能しない理由がわかりません。重複とは、ファイルのIDは同じですが、ファイルパスが異なることを意味します。これは、前に述べたように、問題にはならないはずです。経路に関係なく、最新バージョンが欲しいだけです。他の誰かが問題が何であるかを見ることができますか?ありがとう

   var ordered = listOfItems.OrderBy(x => x.AssetID).ThenByDescending(x => x.LastModifiedDate);
            List<Item> uniqueItems = new List<Item>();

            foreach (Item result in ordered)
            {
                if (!uniqueItems.Any(x => x.AssetID.Equals(result.AssetID)))
                {
                    uniqueItems.Add(result);

                }
            } 

これは私が今持っているものであり、それはまだ複製を許可しています

4

5 に答える 5

3

これは、IDが一意であるかどうかを確認するためにリスト全体を検索していないためです。

List<Item> unique = new List<Item>();

        string curAssetId = null; // here is the problem 

        foreach (Item result in ordered)
        {
            if (!result.ID.Equals(curAssetId)) // here you only compare the last value.
            {
                unique.Add(result);
                curAssetId = result.ID; // You are only assign the current ID value and 
            }
        }

これを解決するには、以下を変更します

     if (!result.ID.Equals(curAssetId)) // here you only compare the last value.
        {
            unique.Add(result);
            curAssetId = result.ID; // You are only assign the current ID value and 
        }

if (!unique.Any(x=>x.ID.Equals(result.ID))) 
        {
            unique.Add(result);

        }
于 2013-02-27T10:53:46.230 に答える
2

このコードが単純化されているだけかどうかはわかりませんが、ID でグループ化し、LastModifiedDate で並べ替えてから、各グループの最初のものだけを取得することを検討しましたか?

何かのようなもの:

var unique = list.GroupBy(i => i.ID).Select(x => x.OrderByDescending(y => y.LastModifiedDate).First());
于 2013-02-27T10:42:05.680 に答える
1

var ordered = list.OrderBy(x => x.ID).ThenByDescending(x => x.LastModifiedDate).Distinct()??

于 2013-02-27T10:33:07.470 に答える
0

この目的のために、独自のEquityComparerを作成する必要があります。その後、linqのDistinctメソッドを使用できます。Enumerable.msdnで区別

また、現在のコードをそのまま使用することもできますが、(サンプルとして)次のように変更する必要があります。

    var ordered = list.OrderByDescending(x => x.LastModifiedDate);
    var unique = new List<Item>();

    foreach (Item result in ordered)
    {
        if (unique.Any(x => x.ID == result.ID))
            continue;
        unique.Add(result);
    }
于 2013-02-27T10:33:37.347 に答える
0
List<Item> p = new List<Item>();
var x = p.Select(c => new Item
     {
         AssetID = c.AssetID,
         LastModifiedDate = c.LastModifiedDate.Date
     }).OrderBy(y => y.id).ThenByDescending(c => c.LastModifiedDate).Distinct();
于 2013-02-27T11:50:43.377 に答える