我有一个C#应用程序,它加载一个名为“Tasks”的CLR对象列表。每个任务都具有以下属性:
public int ID { get; set; }
public int TypeID { get; set; }
public string TypeName { get; set; }
public string Name { get; set; }
我正在尝试在此列表中找到唯一类型的任务。我以为我会尝试使用LINQ来做到这一点。但是,我无法弄清楚如何做到这一点。我怎么说在这个列表中给我所有唯一的TypeID和TypeName?目前我正在尝试下面的内容,这让我无处可去。事实上,它甚至可以编译。
var uniqueTasks = allTasks.Distinct(p => p.TypeID);
谢谢,
答案 0 :(得分:6)
让我确保我理解这个问题:你有一系列叫做allTasks的任务,你想要一个序列没有所有id的重复,是吗?
将任务序列转换为一系列ID:
var ids = allTasks.Select(p=>p.TypeId);
现在你有一系列的ID。您希望过滤掉该序列中的重复项:
var distinctIds = ids.Distinct();
你已经完成了。这就是你追求的目标吗?
答案 1 :(得分:3)
最简单的方法是使用GroupBy
:
var uniqueTasks = allTasks.GroupBy(p => p.TypeID);
这将为您提供一组分组,将TypeID
映射到具有该ID的任务。
如果您想要一组任务,可以编写
var uniqueTasks = allTasks.GroupBy(p => p.TypeID).Select(g => g.First());
答案 2 :(得分:2)
您需要实现自己的比较器:
public class TaskComparer : IEqualityComparer<Task>
{
#region IEqualityComparer<Task> Members
public bool Equals(Task x, Task y)
{
return x.TypeID == y.TypeID && x.TypeName == y.TypeName;
}
public int GetHashCode(Task obj)
{
return obj.TypeID.GetHashCode() + obj.TypeName.GetHashCode();
}
#endregion
}
然后像这样使用它:
var uniqueTasks = allTasks.Distinct(new TaskComparer());
编辑:由于Slaks指出GetHashCode是绝对必要的(我猜它在内部构建了一个HashTable),因此黑客攻击了一些GetHashCode()
答案 3 :(得分:2)
var uniqueTasks = allTasks.Select(t=>t.TypeName).Distinct().ToList();