C# 在C中使用LINQ Distinct#
我在LINQ中使用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
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
};