我有一个记录列表,我需要过滤列表中的重复记录,并只使用 AddressType =" POST" 只记录一条记录。
让我举例说明一下:
class Test
{
public string Id {get; set;}
public string Name {get; set;}
public string AddressType {get; set;}
}
这是我的数据:
var data = new List<Test>{
new Test {Id = "1", Name = "Test11", AddressType = "POST" },
new Test {Id = "1", Name = "Test12", AddressType = "STREET" },
new Test {Id = "2", Name = "Test122", AddressType = "POST" },
new Test {Id = "3", Name = "Test123", AddressType = "POST" },
new Test {Id = "4", Name = "Test1", AddressType = "POST" },
new Test {Id = "4", Name = "Test1", AddressType = "POST" },
new Test {Id = "5", Name = "Test11", AddressType = null }
};
我试图根据Id和AdressType =&#34; POST&#34;删除重复的记录。使用此查询:
var filteredData = data.GroupBy(x => x.Id).Select(x => x.First()).ToList();
这会删除重复项,但我想使用AddressType =&#34; POST&#34;并且上面的查询随机选择了第一条记录。我尝试了另一个使用此查询但它无法正常工作的事情:
var filteredData = data.GroupBy(x => x.Id).Select(x => x.First()).Where(x => x.AddressType == "POST").ToList();
预期产出:
Test {Id = "1", Name = "Test11", AddressType = "POST" },
Test {Id = "2", Name = "Test122", AddressType = "POST" },
Test {Id = "3", Name = "Test123", AddressType = "POST" },
Test {Id = "4", Name = "Test1", AddressType = "POST" },
Test {Id = "5", Name = "Test11", AddressType = null }
我有什么遗失的吗?
更新:由于下面的解决方案,它可以工作,但如果列表中有任何空值。它打破了。因此,通过添加FirstOrDefault(),我能够处理空错误,但该行的详细信息未添加到结果中。有什么想法?
答案 0 :(得分:3)
尝试将谓词放入first
:
var filteredData = data
.GroupBy(x => x.Id)
.Select(x => x.FirstOrDefault(x => x.AddressType == "POST"))
.ToList();
答案 1 :(得分:1)
您可以按所选列进行分组,然后选择FirstOrDefault()。试试吼叫;
var list = data.GroupBy(x => new { x.Id, x.AddressType })
.Select(x => x.FirstOrDefault(a => a.AddressType == "POST" || a.AddressType == null))
.Where(y => y != null)
.ToList();
与预期结果相同:
ID Name AddressType
1 Test11 POST
2 Test122 POST
3 Test123 POST
4 Test1 POST
5 Test11 null
希望答案可以帮到某人。