C#LINQ根据List <string>属性

时间:2019-02-27 02:40:01

标签: c# linq

我有IPInfo个对象的列表,这些对象已通过某种方式过滤。我的问题是根据最后一个List<String>属性来分隔记录:

class IPInfo
{
    public String TRADE_DATE; 
    public String CUSTOMER_NAME;
    public List<String> ORIGINAL_IP;
    public List<String> LOGON_IP = new List<String>();
}

List<IPInfo> fields导出到.xls文件时如下所示:

enter image description here

我需要将每个Logon IP记录放在单独的行中,但需要Original IP保持合并。在一张图片上,我需要CITI

----------------------------------------------
10.55.13.104     |   128.110.34.102
128.110.34.102   |
----------------------------------------------
10.55.13.104     |   10.55.13.104
128.110.34.102   |

有帮助吗?

编辑: 该查询是在合并重复的Logon IP之前应用的。但是,正如我所说的,我需要Logon 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;
    }

1 个答案:

答案 0 :(得分:1)

var distinct = fields
        .GroupBy(x => new { x.TRADE_DATE, x.CUSTOMER_NAME })
        .Select(y => {
            var logonIps = y.SelectMany(x => x.LOGON_IP).Distinct().ToList();

            foreach (var logonIp in logonIps)
            {
                return 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 = logonIp
                };
            }
        })
        .ToList();

return distinct;

浏览登录IP列表,并将其作为每个登录IP的新行。