【问题标题】:How to return different sets of duplicates from a list如何从列表中返回不同的重复项集
【发布时间】:2021-07-27 09:32:44
【问题描述】:

我有以下对象列表:

ConnectionType = ConnectionType.COM
ComPort = "com1"
TcpPort = null
ConnectionName = "CONN0"

ConnectionType = ConnectionType.COM
ComPort = "COM1"
TcpPort = null
ConnectionName = "CONN1"

ConnectionType = ConnectionType.COM
ComPort = "COM1"
TcpPort = null
ConnectionName = "CONN2"

ConnectionType = ConnectionType.COM
ComPort = "COM2"
TcpPort = null
ConnectionName = "CONN3"

ConnectionType = ConnectionType.IP
ComPort = null
TcpPort = 1234
ConnectionName = "CONN4"

ConnectionType = ConnectionType.IP
ComPort = null
TcpPort = 1234
ConnectionName = "CONN5"

ConnectionType = ConnectionType.IP
ComPort = null
TcpPort = 4321
ConnectionName = "CONN6"

每个对象中使用的类型:

private int? tcpPort;
private string comPort;
private string connectionName;
private ConnectionType connectionType;

什么 LINQ 查询会返回每个 ConnectionType 的重复项的查找/字典?结果应包括每个副本的 ComPort/TcpPort 和 ConnectionName。对于 ComPort,查询也应该匹配忽略大小写的字符串。

到目前为止,我已经能够通过以下查询检索到一些理想的结果:

var duplicates = myList
            .GroupBy(x => new { x.ComPort, x.TcpPort }).
            .Where(m => m.Key != null && m.Skip(1).Any());

返回以下内容:

{ ComPort = COM1, TcpPort =  }
     CONN1
     CONN2
{ ComPort = , TcpPort = 1234 }
     CONN4
     CONN5

但是结果输出应该如下所示:

COM1
    CONN0
    CONN1
    CONN2

1234
    CONN4
    CONN5

【问题讨论】:

标签: c# .net linq duplicates


【解决方案1】:

您可以使用此 LINQ 查询:

var result = input.GroupBy(x => x.ConnectionType == ConnectionType.IP ? x.TcpPort : x.ComPort)
                  .Where(x => x.Count() > 1)
                  .Select(x => x.Key + "\n" + string.Join("\n",x.Select(y => "\t" + y.ConnectionName)));

首先,我们按TcpPortComPort 分组,具体取决于ConnectionType。然后我们只使用包含多个项目的组,最后使用Select 子句格式化字符串。

在线演示:https://dotnetfiddle.net/CvvBvl

【讨论】:

  • 感谢 @SomeBody 的建议,但是我收到以下编译器错误:方法 'Enumerable.GroupBy(IEnumerable, Func 的类型参数>)' 不能从用法中推断出来。尝试明确指定类型参数。我相信这是由于 TcpPort 不是字符串而是可以为空的 int 的事实。我已经用正确的类型更新了问题。
【解决方案2】:

按照@SomeBody 和@Jonathan Barclay 的建议,我能够编写以下查询来产生所需的输出:

var duplicates = myList
            .GroupBy(x => x.ConnectionType == ConnectionType.IP ? x.TcpPort?.ToString() : x.ComPort.ToUpperInvariant())
            .Where(x => x.Skip(1).Any());

感谢大家的帮助! :)

【讨论】:

    猜你喜欢
    • 2019-03-07
    • 2015-10-04
    • 1970-01-01
    • 2014-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    相关资源
    最近更新 更多