【问题标题】:how to get distinct elements from a list in c# [duplicate]如何从c#中的列表中获取不同的元素[重复]
【发布时间】:2014-01-02 14:54:01
【问题描述】:

我有一个元素列表,其中元素是一些字符串和日期时间值的类。我的情况是列表中的某些元素是相同的,但我只想要唯一的条目。我尝试了以下但没有结果。而且我已经确认有重复条目。以下是一些片段:

  public class RunningProcess
{
    public string PSComputerName { get; set; }
    public string ProcessName { get; set; }
    public string ProcessID { get; set; }
    public string CommandLine { get; set; }
    public Nullable<System.DateTime> CreationDate { get; set; }
    public string Username { get; set; }
    public string RemoteIP { get; set; }
}

现在:

  l_runningprocesses = l_runningprocesses.Distinct().ToList();

  var unique_items = new HashSet<RunningProcess>(l_runningprocesses);

  List<RunningProcess> uniques = new List<RunningProcess>();
  foreach (RunningProcess item in l_runningprocesses)
  {
      if (!uniques.Contains(item)) uniques.Add(item);
  }

都一样。我保留双打。有什么想法吗??

问候,

罗纳德

【问题讨论】:

  • 您还没有为您的类定义 Equals 和 GetHashCode,因此通过引用比较条目 - 如果引用不同,则条目被视为不同(即使所有字段值都相等)
  • 您需要更具体地说明您认为不同的内容,在这种情况下,ProcessID 将始终不同,因此不同的列表应该与非不同的列表相同。
  • l_runningprocesses ?它的类型是什么,

标签: c# list unique distinct


【解决方案1】:

Distinct 是比较对象引用,而不是对象的内容。你必须写一个 EqualityComparer 然后使用 distinct 的重载。

一个简单的选择是:

l_runningprocesses=l_runningprocesses
  .GroupBy(item=>item.ProcessID)
  .Select(group=>group.First())
  .ToList();

【讨论】:

  • 或使用DistinctBy MoreLINQ 运算符
【解决方案2】:
l_runningprocesses = l_runningprocesses.Distinct().ToList();

不会给你不同的对象。 .Distinct() 适用于 int、double 列表或 Linq to SQL、EntityFramework 等位置。

一种方法是编写自己的IEqualityComparer

public class RunningProcessComparer : IEqualityComparer<RunningProcess>
{
    public bool Equals(RunningProcess x, RunningProcess y)
    {
        return x.ProcessID == y.ProcessID;
    }

    public int GetHashCode(RunningProcess obj)
    {
        return obj.ProcessID.GetHashCode();
    }
}

然后将其用作

l_runningprocesses = l_runningprocesses.Distinct(new RunningProcessComparer());

【讨论】:

  • GetHashCode 应该返回 int,而不是 string
  • 谢谢,我已经在我的回答中更正了
猜你喜欢
  • 2016-03-22
  • 1970-01-01
  • 2022-07-09
  • 2021-04-14
  • 2016-11-02
  • 1970-01-01
  • 2020-09-11
  • 2021-05-11
  • 1970-01-01
相关资源
最近更新 更多