繁体   English   中英

LINQ不同的查询

[英]LINQ Distinct Query

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

谢谢,

让我确保我理解这个问题:你有一系列叫做allTask​​s的任务,你想要一个没有重复所有id的序列,是吗?

将任务序列转换为一系列ID:

var ids = allTasks.Select(p=>p.TypeId);

现在你有了一系列的ID。 您希望过滤掉该序列中的重复项:

var distinctIds = ids.Distinct();

而且你已经完成了。 这就是你追求的吗?

最简单的方法是使用GroupBy

var uniqueTasks = allTasks.GroupBy(p => p.TypeID);

这将为您提供一组分组,将TypeID映射到具有该ID的任务。

如果你想要一组任务,你可以写

var uniqueTasks = allTasks.GroupBy(p => p.TypeID).Select(g => g.First());

您需要实现自己的比较器:

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()黑掉了

 var uniqueTasks = allTasks.Select(t=>t.TypeName).Distinct().ToList();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM