过滤重复的行

时间:2018-06-08 10:53:17

标签: c# .net linq

我这里有一段代码:

var grouped = nonGrouped.GroupBy(x => new
{
    x.Id,
    x.Col1,
    x.Col2
}).Select(x => new MyDbTable
{
    Id = x.Key.Id,
    VALUE = x.Sum(y => y.Value),
    Col1 = x.Key.Col1,
    Col2 = x.Key.Col2
}).ToList();

//Filter out rows with the same Col1/Col2 combination
var dbTableList = new List<MyDbTable>();
grouped.ForEach(x =>
{
    if (!dbTableList.Any(a => a.Col1 == x.Col2 && a.Col2 == x.Col1))
    {
        dbTableList.Add(x);
    }
});

我想删除注释“//使用相同的Col1 / Col2组合过滤行”下的代码,并以某种方式将此功能添加到注释上方的LINQ语句

4 个答案:

答案 0 :(得分:0)

你不能这样做吗?

var grouped = nonGrouped.GroupBy(x => new
            {
                x.Id,
                x.Col1,
                x.Col2
            }).Select(x => new MyDbTable
            {
                Id = x.Key.Id,
                VALUE = x.Sum(y => y.Value),
                Col1 = x.Key.Col1,
                Col2 = x.Key.Col2
            }).Where(z => z.Col1 != z.Col2).ToList();

还是我完全误解了你的问题?它发生在以前:)

答案 1 :(得分:0)

我认为您正在寻找grouped列表

的自定义不同值
class MyDbTableComparer : IEqualityComparer<MyDbTable>
{
    public bool Equals(MyDbTable x, MyDbTable y)
    {
        if (x.Col1 == y.Col2 && x.Col2 == y.Col1) return true;
        return false;
    }
}

之后,将上层语句改为:

.Select(x => new MyDbTable
{
    Id = x.Key.Id,
    VALUE = x.Sum(y => y.Value),
    Col1 = x.Key.Col1,
    Col2 = x.Key.Col2
}).ToList().Distinct(new MyDbTableComparer());

但我不知道如果您在Distinct()之前使用ToList()

,它是否会正常工作

答案 2 :(得分:0)

nonGrouped.GroupBy(x => new { x.Col1, x.Col2 }).Where(group => !group.Take(1).Any()).SelectMany(group => group).GroupBy(x => x.Id, x.Col1,x.Col2);可能有用。

不知道为什么你这里的逻辑是什么(为什么如果你想要删除所有具有相同col1和col2的行,为什么需要按Id,Col1和Col2分组。

答案 3 :(得分:0)

这应该很适合你:

var dbTableList =
    nonGrouped
        .GroupBy(x => new
        {
            x.Id,
            x.Col1,
            x.Col2
        })
        .Select(x => new MyDbTable
        {
            Id = x.Key.Id,
            VALUE = x.Sum(y => y.Value),
            Col1 = x.Key.Col1,
            Col2 = x.Key.Col2
        })
        .GroupBy(x => new
        {
            x.Col1,
            x.Col2
        })
        .SelectMany(xs => xs.Take(1))
        .ToList();

完成此项工作的关键是GroupBy / SelectMany / Take(1)组合。