【问题标题】:C# Removing elements from a List of Class having duplicate values of specific class properties [duplicate]C#从具有特定类属性重复值的类列表中删除元素[重复]
【发布时间】:2021-09-27 06:50:24
【问题描述】:

删除具有某些特定重复属性的类列表中的元素

我将尝试用一个示例 C# 代码来解释-

有一个List<A>,其中 A 是一个类

Class A
{
 Int Id{get; set;}
 String name{ get; set;}
 B b{get; set;} // B is a Class
}
Class B
{
 Int sId{get; set;}
 String detail{get; set;}
}

现在List<A> 包含一个元素列表。我必须从该列表中删除那些 Id 和 sId 曾经在列表中出现过的特定重复项。 所以它只是从列表中删除重复项,但需要这两个属性。

对此的任何帮助将不胜感激

添加更多细节以获得更好的解释

考虑一下这个代表我上面代码的 Json 数据-

A{
   Id: 1
   Name:  Harry
   b
    { 
      sId: 1
      detail: Book
     },

    Id: 2
   Name:  Harry
   b
    { 
      sId: 2
      detail: Book
     }

     Id: 1
   Name:  Russel
   b
    { 
      sId: 1
      detail: Biography
     }

我想要的输出-

A{
   Id: 1
   Name:  Harry
   b
    { 
      sId: 1
      detail: Book
     },

    Id: 2
   Name:  Harry
   b
    { 
      sId: 2
      detail: Book
    }

还想告诉大家,这种基本方法运行良好-

int a;
int b;
for (int i = 0; i < A.Count; i++)
{
a = A[i].Id;
b = A[i].b.sId;
for (int j = i + 1; j < (A.Count-1); j++)
{
if ((A[j].Id == a) && (A[j].b.sId == b))
{
A.RemoveAt(j);
}
}
}

但是如果有更好的方法来做到这一点,那就太好了。也许是 Linq 或其他

需要帮助...谢谢

【问题讨论】:

  • 您的示例 C# 代码,实际上不是 C# 代码,并且充满了错误。你的 json 实际上不是 json 并且充满了错误,而且你包含的 C# 格式不是很好
  • “但如果有更好的方法就好了” 你认为什么“更好”?更少的代码行?快点? ... ?如果工作人员能胜任工作,那么您到底需要什么?
  • 这是退出 LinqPad 并开始自己编写它的绝佳机会,这里是包含大量示例的规范指南docs.microsoft.com/en-us/samples/dotnet/try-samples/…
  • 您可以使用 Group by:stackoverflow.com/questions/489258/…

标签: c# .net linq


【解决方案1】:

首先,您的代码应该是 C# 代码是不正确的,但是这个想法很清楚。以下是您需要做的:

拥有更好的 A 和 B 类版本,以至少编译并满足基本的 C# 编码准则:

    public class A
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public B B { get; set; }
    }

    public class B
    {
        public int SId { get; set; }
        public string Detail { get; set; }
    }

这是获得过滤结果所需的代码行(假设要过滤的集合名为collectionOfAs):

var res = collectionOfAs.Distinct(new Comparer());

这是您可以使用的“比较器”:

    public class Comparer : IEqualityComparer<A>
    {
        public bool Equals(A x, A y)
        {
            return x.Id == y.Id && x.B.SId == y.B.SId;
        }

        public int GetHashCode(A obj)
        {
            return obj.Id.GetHashCode() + obj.B.SId.GetHashCode();
        }
    }

【讨论】:

    猜你喜欢
    • 2020-04-04
    • 1970-01-01
    • 2021-07-26
    • 2015-01-05
    • 1970-01-01
    • 2012-09-09
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多