我有一个包含元素的列表,其中元素是一些字符串和日期时间值的类。我的情况是列表中的某些元素是相同的,但我只想要唯一的条目。我尝试了以下但没有结果。我已经确认有两个条目。这些是一些狙击手:
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);
}
一切都一样。我保持双打。任何人的想法??
此致
罗纳德
答案 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());