如何从c#中的列表中获取不同的元素

时间:2014-01-02 14:54:02

标签: c# list unique distinct

我有一个包含元素的列表,其中元素是一些字符串和日期时间值的类。我的情况是列表中的某些元素是相同的,但我只想要唯一的条目。我尝试了以下但没有结果。我已经确认有两个条目。这些是一些狙击手:

  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);
  }

一切都一样。我保持双打。任何人的想法??

此致

罗纳德

2 个答案:

答案 0 :(得分:1)

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

一个简单的选择是:

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

答案 1 :(得分:1)

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());