Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中使用LINQ Distinct#_C#_Linq - Fatal编程技术网

C# 在C中使用LINQ Distinct#

C# 在C中使用LINQ Distinct#,c#,linq,C#,Linq,我在LINQ中使用distinct时遇到问题。我有以下清单: LineIdChanged LineId OldGatewayPCId NewGatewayPCId LineStringID PlantID 1 93 83 88 160 2 2 93 83 88 161

我在LINQ中使用
distinct
时遇到问题。我有以下清单:

LineIdChanged   LineId  OldGatewayPCId  NewGatewayPCId  LineStringID    PlantID
1               93      83              88              160             2
2               93      83              88              161             2
3               94      82              87              162             2
4               94      82              87              163             2
我尝试的是获取一个不同的LineId值,因此在本例中,我应该只获取两个对象,而不是全部四个对象。我试过这个:

  var s = (from n in _dataBaseProvider.SelectPjdGatewayLineChanged(selectedSourcePlant.LPS_Database_ID)
          select new PjdGatewayLineChanged() { LineId = n.LineId, LpsLineNo = n.LpsLineNo, LineIdChanged = n.LineIdChanged}).Distinct();

  LinesOld = s.ToList();
但是这给了我全部4个对象。

您需要使用
来区分

var s = 
    (from n in _dataBaseProvider.SelectPjdGatewayLineChanged
    (selectedSourcePlant.LPS_Database_ID)
    select new PjdGatewayLineChanged
    { 
        LineId = n.LineId,
        LpsLineNo = n.LpsLineNo, 
        LineIdChanged = n.LineIdChanged
    })
    .DistinctBy(p => p.LineId);

您的问题是LINQ和.Net framework不知道如何区分类型为
PjdGatewayLineChanged
的不同对象。因此,它使用默认的东西,即在内存引用项中寻找相等

因此,您需要做的是使用此方法的第二个重载,并提供一个
IEqualityComparer

Distinct(IEnumerable,IEqualityComparer)
这样LINQ就知道如何比较类型为
PjdGatewayLineChanged


如果你认为所有的行相等,如果它们有相等的字段:

,那么IEDyQuealEnter

< P>的MSDN
var s = (from p in _dataBaseProvider.SelectPjdGatewayLineChanged(selectedSourcePlant.LPS_Database_ID)
    select new PjdGatewayLineChanged() 
    { 
        LineId = p.LineId,
        LpsLineNo = p.LpsLineNo, 
        LineIdChanged = p.LineIdChanged
    })
    .GroupBy(p => p.LineId)
    .Select(p => p.First());
您可以按id分组,然后为每个组取第一行

或者,更紧凑

var s = from p in _dataBaseProvider.SelectPjdGatewayLineChanged(selectedSourcePlant.LPS_Database_ID)
    group p by p.LineId into q
    let r = q.First()
    select new PjdGatewayLineChanged() 
    { 
        LineId = r.LineId,
        LpsLineNo = r.LpsLineNo, 
        LineIdChanged = r.LineIdChanged
    };
通过这种方式,
PjdGatewayLineChanged
的创建已经移动到最后一步(在选择了groupby的正确“候选者”之后)。

事情就是这样。 Distinct(IEnumerable)方法返回不包含重复值的无序序列。它使用默认的相等比较器来比较值

有两个选项可用于自定义类型的
.Distinct()

  • PjdGatewayLineChanged
    提供您自己的GetHashCode和Equals方法
  • 将重载的Distinct与自定义相等比较器一起使用

  • 欲了解更多信息,请查看MSDN中的Distinct,您会发现有助于实现所需功能的良好文档代码片段。

    我无法缩进这个怪物…:(或者,
    .GroupBy(p=>p.LineId)。选择(x=>x.First())
    ,这就是MoreLinq在引擎盖下所做的基本工作(减去聪明的流媒体内容)@anaximander不太可能,它使用了一个Hashset,因此不需要分组和选择。我的记忆似乎很模糊。它使用了我在Hashset不可用的平台上所述的方法。因此,如果你不想包含整个库,你只需使用该函数的实现(当然要确定它的属性)。您可以在这里查看使用GroupBy来帮助您。例如,或者您获得所有4行,因为
    LineIdChanged
    对于每一行都是不同的。同样的问题可能存在于
    LpsLineNo
    中,我在您描述的数据中看不到这一点。什么是
    LpsLineNo
    ?@NoLifeKing是正确的。您将获得4行,因为您需要获取的字段是唯一的,统称。
    var s = from p in _dataBaseProvider.SelectPjdGatewayLineChanged(selectedSourcePlant.LPS_Database_ID)
        group p by p.LineId into q
        let r = q.First()
        select new PjdGatewayLineChanged() 
        { 
            LineId = r.LineId,
            LpsLineNo = r.LpsLineNo, 
            LineIdChanged = r.LineIdChanged
        };