Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.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根据列表属性从自定义对象列表中过滤出重复项_C#_Linq - Fatal编程技术网

C# C根据列表属性从自定义对象列表中过滤出重复项

C# C根据列表属性从自定义对象列表中过滤出重复项,c#,linq,C#,Linq,我有一个自定义IPInfo对象的列表。我需要根据这个类的两个属性过滤掉重复项 下面是一节课: class IPInfo { public String TRADE_DATE; public String CUSTOMER_NAME; public List<String> ORIGINAL_IP; public List<String> LOGON_IP = new List<String>(); } 请给我一些提示 交易日

我有一个自定义IPInfo对象的列表。我需要根据这个类的两个属性过滤掉重复项

下面是一节课:

class IPInfo
{
    public String TRADE_DATE; 
    public String CUSTOMER_NAME;
    public List<String> ORIGINAL_IP;
    public List<String> LOGON_IP = new List<String>();
}
请给我一些提示

交易日期客户姓名原始IP登录IP

您可以尝试GroupBy和First,如果我们有一组重复项,我们应该只使用第一项

另一个问题是如何按列表分组登录\u IP是一个列表;假设登录IP相等,当且仅当它们以相同的顺序具有相同的项时,我们可以 在string.Join的帮助下将登录IP转换为字符串;如果登录IP内的顺序不重要,我们可以使用

string.Join(" ", x.LOGON_IP.OrderBy(ip => ip))
代码:

试试看:

private static List<IPInfo> selectFields(ref List<IPInfo> fields)
{
    var distinct =
        fields
            .GroupBy(x => new { x.TRADE_DATE, x.CUSTOMER_NAME })
            .Select(y => new IPInfo()
            {
                TRADE_DATE = y.Key.TRADE_DATE,
                CUSTOMER_NAME = y.Key.CUSTOMER_NAME,
                ORIGINAL_IP = y.SelectMany(x => x.ORIGINAL_IP).Distinct().ToList(),
                LOGON_IP = y.SelectMany(x => x.LOGON_IP).Distinct().ToList()
            })
            .ToList();

    return distinct;
}

MoreLINQ的distinctby您可以使用HashSet或Dictionary@Enigmativity为什么?@MarcoSalerno-ref使您的代码难以推理。局部变量的更改可能发生在您不期望的地方。我正在使用另一个函数Foo…ref List fields中的List,并希望从这个Foo函数中优化字段。所以私有selectFields就是为了这个目的。但我可以不参考它。请告诉我如何。这个代码结合了记录。我现在有一张很大的唱片,而不是很多类似的唱片。如何删除重复项?也许不应该使用LINQ?@user2376997-您是否也要删除重复的IP?我只是编辑了我的答案。这段代码并没有删除重复项。所有记录仍在列表中。如何删除它们?所有记录仍然保留。我从另一个函数fields=selectFieldsref fields;调用它;。因此,我导出到.xls文件,并且记录与图片中的一样重复above@user2376997:我明白了,错误行为的原因是我们按列表x.LOGON\u IP分组,让我们在string.joint的帮助下将列表转换为字符串。它不是编译
private static List<IPInfo> selectFields(ref List<IPInfo> fields)
{
    var distinct = fields 
      .GroupBy(x => new { x.CUSTOMER_NAME, ips = string.Join(" ", x.LOGON_IP) })
      .Select(chunk => chunk.First())
      .ToList();

    return distinct;
}
private static List<IPInfo> selectFields(ref List<IPInfo> fields)
{
    var distinct = fields 
      .GroupBy(x => new { x.CUSTOMER_NAME, ips = string.Join(" ", x.LOGON_IP) })
      .Where(chunk => chunk.Count() == 1)
      .Select(chunk => chunk.First())
      .ToList();

    return distinct;
}
private static List<IPInfo> selectFields(ref List<IPInfo> fields)
{
    var distinct =
        fields
            .GroupBy(x => new { x.TRADE_DATE, x.CUSTOMER_NAME })
            .Select(y => new IPInfo()
            {
                TRADE_DATE = y.Key.TRADE_DATE,
                CUSTOMER_NAME = y.Key.CUSTOMER_NAME,
                ORIGINAL_IP = y.SelectMany(x => x.ORIGINAL_IP).Distinct().ToList(),
                LOGON_IP = y.SelectMany(x => x.LOGON_IP).Distinct().ToList()
            })
            .ToList();

    return distinct;
}