简体   繁体   English

ASP.net 核心 C# Linq 不同的不工作

[英]ASP.net Core C# Linq Distinct not working

I've trying to use Linq for the first time to get distinct values from a list in ASP.net Core Razor Pages.我第一次尝试使用 Linq 从 ASP.net 核心 Razor 页面中的列表中获取不同的值。

For this i'm using the below code but it just returns all the rows from the original list including the duplicates:为此,我使用以下代码,但它只返回原始列表中的所有行,包括重复项:

PLDistinct = PL.Select(p => new ProcessListSummary {  Title=  p.Title, 
                                                  WSID = p.WSID,
                                                  QImageTnURL = p.QImageTnURL,
                                                  QImageURL = p.QImageURL,
                                                  QDescription = p.QDescription,
                                                  PComplete= p.PComplete,
                                                  MIdent = p.MIdent,
                                                  WID = p.WID})
                                                  .Distinct().ToList();

What am I doing wrong please?请问我做错了什么?

Many thanks非常感谢

Your class ProcessListSummary probably does not override Equals and GetHashCode , so the default will be used from System.Object that just compares references.您的 class ProcessListSummary可能不会覆盖EqualsGetHashCode ,因此将使用System.Object中的默认值,它只是比较引用。 You use always a new instance of ProcessListSummary , so all are considered to be unequal.您始终使用ProcessListSummary的新实例,因此所有实例都被认为是不平等的。

So either override Equals + GetHashCode meaningfully, by comparing the relevant properties, and/or implement IEquatable<ProcessListSummary> (in the same way) or pass a custom IEqualityComparer<ProcessListSummary> to Distinct .因此,要么通过比较相关属性来有意义地覆盖Equals + GetHashCode ,和/或实现IEquatable<ProcessListSummary> (以相同方式)或将自定义IEqualityComparer<ProcessListSummary>传递给Distinct The latter should be done if you have multiple ways to compare this class or you don't want to change (or can't change) it in general.如果您有多种方法来比较此 class 或者您通常不想更改(或无法更改)它,则应该使用后者。

Another option is to use Distinct on an anonymous type or tuple which provide that feature:另一种选择是对提供该功能的匿名类型或元组使用Distinct

PLDistinct = PL
    .Select(p => (p.Title,p.WSID,p.QImageTnURL,p.QImageURL,p.QDescription,p.PComplete,p.MIdent,p.WID))
    .Distinct()
    .Select(p => new ProcessListSummary {  Title=  p.Title, 
                                           WSID = p.WSID,
                                           QImageTnURL = p.QImageTnURL,
                                           QImageURL = p.QImageURL,
                                           QDescription = p.QDescription,
                                           PComplete= p.PComplete,
                                           MIdent = p.MIdent,
                                           WID = p.WID})
    .ToList();

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

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