2

重複した ID を返す API を使用しています。EF を使用して、これらの値をデータベースに挿入する必要があります。オブジェクトを追加する前に、重複を取り除きたいと思います。

私が書こうとしているコードの小さな例があります。

  var itemsToImport = new List<Item>(){};
        itemsToImport.Add(new Item() { Description = "D-0", Id = 0 });            
        for (int i = 0; i < 5; i++)
        {
            itemsToImport.Add(new Item(){Id = i,Description = "D-"+i.ToString()});
        }

        var currentItems = new List<Item>
                        {
                            new Item() {Id = 1,Description = "D-1"},
                            new Item(){Id = 3,Description = "D-3"}
                        };
        //returns the correct missing Ids
        var missing = itemsToImport.Select(s => s.Id).Except(currentItems.Select(s => s.Id));


        //toAdd contains the duplicate record. 
        var toAdd = itemsToImport.Where(x => missing.Contains(x.Id));
        foreach (var item in toAdd)
        {
            Console.WriteLine(item.Description);
        }

繰り返しがある場合でも単一のレコードのみを返すように変数「toAdd」を修正するには、何を変更する必要がありますか?

4

3 に答える 3

3

これを行うには、IDでグループ化し、各グループの最初のアイテムを選択します。

var toAdd = itemsToImport
              .Where(x => missing.Contains(x.Id));

になります

var toAdd = itemsToImport
              .Where(x => missing.Contains(x.Id))
              .GroupBy(item => item.Id)
              .Select(grp => grp.First());
于 2012-05-16T05:22:57.797 に答える
2

https://stackoverflow.com/a/2298230/385844で Jon Skeet が推奨するように、 MoreLINQのDistinctBy を使用します。

呼び出しは次のようになります。

var toAdd = itemsToImport.Where(x => missing.Contains(x.Id)).DistinctBy(x => x.Id);

何らかの理由で MoreLINQ を使用したくない (または使用できない) 場合は、DistinctBy を自分で簡単に実装できます。

static IEnumerable<T> DistinctBy<T, TKey>(this IEnumerable<T> sequence, Func<T, TKey> projection)
{
    var set = new HashSet<TKey>();
    foreach (var item in sequence)
        if (set.Add(projection(item)))
            yield return item;
}
于 2012-05-16T05:41:34.630 に答える
0

機能を使用できますDistinct。ただし、オーバーライドする必要がEqualsあります(同じデータが含まれている場合)。GetHashCodeItem

またはFirstOrDefault、一致する ID を持つ最初のアイテムを取得するために使用します。

itemsToImport.Where(x => missing.Contains(x.Id)).FirstOrDefault() 
于 2012-05-16T05:22:45.853 に答える