LINQ不同的查询

时间:2010-02-24 19:38:54

标签: c# linq

我有一个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);

谢谢,

4 个答案:

答案 0 :(得分:6)

让我确保我理解这个问题:你有一系列叫做allTask​​s的任务,你想要一个序列没有所有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();