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
C# Linq中GroupBy用于重复记录的案例条件_C#_Linq_Duplicates - Fatal编程技术网

C# Linq中GroupBy用于重复记录的案例条件

C# Linq中GroupBy用于重复记录的案例条件,c#,linq,duplicates,C#,Linq,Duplicates,我有一个记录列表,我需要在列表中筛选重复记录,并使用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 {

我有一个记录列表,我需要在列表中筛选重复记录,并使用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 }
            };
这消除了重复性,但我想获取AddressType=“POST”的记录,上面的查询随机选取第一条记录。我尝试了另一种方法,但该查询不起作用:

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(),我能够处理null错误,但该行的详细信息不会添加到结果中。对此有何想法?

首先尝试将谓词放在对
的调用中:

var filteredData = data
   .GroupBy(x => x.Id)
   .Select(x => x.FirstOrDefault(x => x.AddressType == "POST"))
   .ToList();

您可以按所选列分组,然后选择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

希望答案能帮助别人。

是的,它奏效了。谢谢你的及时回复。我只是好奇为什么在我指定相同条件时,它在First()方法之外不起作用。有什么想法吗?是的,你在
.Where()
之前做了
.First()
。完成
.First()
后,您将不再处理列表,而是处理某种类型的
对象。如果您在
.First()
之前执行了
.Where()
,它就会起作用<代码>选择(x=>x.Where(x=>x.AddressType==“POST”).First())
。但是,首先将谓词放入
中更为优雅:)好的,很好。解决方案的一个问题是,如果AddressType中的值为null,它将抛出异常。所以我添加了变量filteredData=data.GroupBy(x=>x.Id);但我也需要空的记录。如果AddressType为空,则无法获取详细信息。@SahilSharma啊,当然,
FirstOrDefault
更适合这种情况。更新了我的答案,改为使用它!:)是的,这也起作用了,但如果AddressType为null,我会感到震惊。我还需要null的名称和Id详细信息,但此条件无法获取该详细信息。任何解决方案?如果AddressType为空。您想添加所有空AddressType对象吗?@SahilSharma您能为问题添加一些虚拟数据吗。对于您的stateYes和其他详细信息ID和Namevar数据=新列表{new Test{ID=“1”,Name=“Test11”,AddressType=“POST”},新测试{ID=“1”,Name=“Test12”,AddressType=“STREET”},新测试{ID=“2”,Name=“Test122”,AddressType=“POST”},新测试{ID=“3”,Name=“Test123”,AddressType=“POST”},新测试{Id=“4”,Name=“Test1”,AddressType=“POST”},新测试{Id=“4”,Name=“Test1”,AddressType=null};您能添加您的预期结果吗please@arslanaybars-我已添加了预期输出
   ID   Name     AddressType

    1   Test11   POST
    2   Test122  POST
    3   Test123  POST
    4   Test1    POST
    5   Test11   null