2017-06-21 70 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());