簡體   English   中英

刪除對象C#列表中的重復項

[英]Delete the repeated Item inside a List of object C#

我想比較一個對象列表的元素,刪除重復的Item並增加該Item的數量(C#代碼),我不知道該使用LinQ,For還是foreach語句:我想刪除具有相同FK_ArtikelId的OrderItem並增加OrderItem的數量。 經驗:

for (int i=1 ; i < lot.Count   ; i ++)
{
    for (j = i + 1; j <= lot.Count; j++)
    {
        if (lot[i].FK_ArticleId.Equals(lot[j].FK_ArticleId))
        {
            lot[i].Quantity += lot[j].Quantity;
            lot.Remove(lot[j]);
        }
    }
}

您必須使用GroupBy linq方法並處理生成的組:給定類

public class Article
{
    public int FK_ArticleId { get; set; }
    public int Quantity { get; set; }
}

以及以下列表:

var list = new List<Article>()
{
    new Article() {FK_ArticleId = 1, Quantity = 10}
    , new Article() {FK_ArticleId = 1, Quantity = 10}
    , new Article() {FK_ArticleId = 1, Quantity = 10}
    , new Article() {FK_ArticleId = 2, Quantity = 100}
    , new Article() {FK_ArticleId = 2, Quantity = 100}
    , new Article() {FK_ArticleId = 3, Quantity = 1000}
};

以下linq查詢返回您需要的內容:

list.GroupBy(a => a.FK_ArticleId)
    .Select(g => new Article() {FK_ArticleId = g.Key, Quantity = g.Sum(a => a.Quantity)});

// article id 1, quantity 30
// article id 2, quantity 200
// article id 3, quantity 1000

如果您不想創建新文章,則可以使用結果組中的第一個並將其“ Quantity設置為正確的值:

var results = list.GroupBy(a => a.FK_ArticleId)
    .Select(g =>
    {
        var firstArticleOfGroup = g.First();
        firstArticleOfGroup.Quantity = g.Sum(a => a.Quantity);
        return firstArticleOfGroup;
    });

我沒有測試,但這應該可以使您了解linq的功能...

 var stuff  = lot
  .GroupBy(p => p.FK_ArticleId)
  .Select(g => g)
  .ToList();

這應該給您組articleID,以便您可以輕松獲得計數,創建新的合並列表等。

對於初學者,您不能使用foreach因為您正在修改列表,並且Enumerator將引發異常。 您可以使用Linq執行以下操作:

var grouped = lot.GroupBy(x => x.FK_ArticleId).ToArray();
foreach(var group in grouped)
{
    group.First().Quantity = group.Sum(item => item.Quantity);
}

現在,每個組中的第一個項目將包含具有相同FK_ArticleId的所有項目數量的FK_ArticleId 現在,要獲得結果,請使用以下命令:

var results = grouped.Select(g => g.First());

在這一點上,完全由您決定是將結果作為單獨的集合返回還是將其插入原始列表中。 如果您選擇第二種方法,請不要忘記先清除列表:

list.Clear();
list.AddRange(results);

編輯

將“ Quantity屬性累積到每個組的第一項中的一種更優雅的解決方案是:

data.GroupBy(x=>x.FK_ArticleId)
    .Select(g => g.Aggregate((acc, item) => 
        {
             acc.Quantity = item.Quantity; 
             return acc;
        }));

這是我在LinqPad中報廢的內容:

結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM