2017-06-21 69 views
1

我有類類型的刪除列表中的重複項目在C#

public class MyClass 
{   
    public SomeOtherClass classObj;   
    public string BillId;   
} 

public List<MyClass> myClassObject; 

樣本值的列表:

BillId = "123",classObj = {}, 
BillId = "999",classObj = {}, 
BillId = "777",classObj = {}, 
BillId = "123",classObj = {} 

所以在上面的例子中,我們有BillId重複的值。我想刪除所有重複值(不是唯一),因此結果將只包含999 & 777值。通過全項達到這

  • 的獨特BillId
  • 獲取計數如果計數大於1

    的一種方式,商店,BillId另一個變量

  • 循環一次刪除商品基於BillId

其他是否有任何直接的方法來實現這一目標?

+3

您想刪除所有具有重複值的對嗎?在你的情況下,你想刪除這兩個123? –

+0

@JoePhillips這是正確的 – Shaggy

+0

@Shaggy檢查答案 – Sajeetharan

回答

11

,我認爲這會工作:

var result = myClassObject.GroupBy(x => x.BillId) 
    .Where(x => x.Count() == 1) 
    .Select(x => x.First()); 

小提琴here

+0

啊,這看起來不錯。 – jdmdevdotnet

+0

是的,它返回一個bool列表。 – IvanJazz

+0

@adjan謝謝你指出。 – maccettura

3

你也可以做到這一點,

var result = myClassObject.GroupBy(x => x.BillId) 
       .Where(x => !x.Skip(1).Any()) 
       .Select(x => x.First()); 

FIDDLE

+4

這不包括'123'嗎? – jdmdevdotnet

+1

'我想刪除所有重複的值(不分明),所以結果將只包含999&777值'我想他想從列表中刪除完全重複。糾正我,如果我錯了,但這將返回123. – jdmdevdotnet

+0

他明確表示「沒有明顯的」。這是另一種在Linq中實現Distinct()效果的方法。 – FireSarge

0

試試這個。

var distinctList = myClassObject.GroupBy(m => m.BillId) 
           .Where(x => x.Count() == 1) 
           .SelectMany(x => x.ToList()) 
           .ToList(); 
0

這可能有所幫助。

var result = myClassObject 
      .GroupBy(x => x.BillId) 
      .Where(x => x.Count()==1) 
      .Select(x => x.FirstOrDefault());