首页 > 解决方案 > 具有特殊值条件的分组导致Linq c#

问题描述

我需要在Group by使用键 prop0、prop1时过滤值结果

我所做的是尝试在select何时添加条件Group by但不使用错误,如下所示:

Cannot implicitly convert type 'bool' to 'int'
Cannot implicitly convert type 'bool' to 'string'

这是我的代码

public class MyClass
{
   public string prop0 { get; set; }
   public int prop1 { get; set; }
   public string prop2 { get; set; }
   public int prop3 { get; set; }
}
static void Main(string[] args)
{
   var list1 = new List<MyClass>();
   list1.Add(new MyClass() { prop0 = "001", prop1 = 1, prop2 = "AAA", prop3 = 100 });
   list1.Add(new MyClass() { prop0 = "001", prop1 = 2, prop2 = "BBB", prop3 = 200 });
   list1.Add(new MyClass() { prop0 = "002", prop1 = 1, prop2 = "CCC", prop3 = 300 });
   list1.Add(new MyClass() { prop0 = "002", prop1 = 1, prop2 = "XXX", prop3 = 400 });
   list1.Add(new MyClass() { prop0 = "003", prop1 = 1, prop2 = "DDD", prop3 = 500 });
   list1.Add(new MyClass() { prop0 = "004", prop1 = 1, prop2 = "XXX", prop3 = 600 });
   list1.Add(new MyClass() { prop0 = "004", prop1 = 1, prop2 = "EEE", prop3 = 700 });

   var tmpList = (from p in list1
                 group p by new
                 {
                     p.prop0,
                     p.prop1
                 } into data
                 select new MyClass()
                 {
                     prop0 = data.Key.prop0,
                     prop1 = data.Key.prop1,
                     prop2 = data.Select(p => p.prop2 == "XXX").First(),
                     prop3 = data.Select(p => p.prop2 == "XXX").First(),
                 }).ToArray();
   Console.WriteLine();
}

原始清单

{ prop0 = "001", prop1 = 1, prop2 = "AAA", prop3 = 100 },
{ prop0 = "001", prop1 = 2, prop2 = "BBB", prop3 = 200 },
{ prop0 = "002", prop1 = 1, prop2 = "CCC", prop3 = 300 },
{ prop0 = "002", prop1 = 1, prop2 = "XXX", prop3 = 400 },
{ prop0 = "003", prop1 = 1, prop2 = "DDD", prop3 = 500 },
{ prop0 = "004", prop1 = 1, prop2 = "XXX", prop3 = 600 },
{ prop0 = "004", prop1 = 1, prop2 = "EEE", prop3 = 700 }

=> 我想要的结果

{ prop0 = "001", prop1 = 1, prop2 = "AAA", prop3 = 100 },
{ prop0 = "001", prop1 = 2, prop2 = "BBB", prop3 = 200 },
{ prop0 = "002", prop1 = 1, prop2 = "XXX", prop3 = 400 },
{ prop0 = "003", prop1 = 1, prop2 = "DDD", prop3 = 500 },
{ prop0 = "004", prop1 = 1, prop2 = "XXX", prop3 = 600 }

标签: c#linqgroup-by

解决方案


只需检查具有“XXX”值的第一个对象,如果未找到则获取第一个值

var tmpList = (from p in list1
                 group p by new
                 {
                     p.prop0,
                     p.prop1
                 } into data
                 select new MyClass()
                 {
                     prop0 = data.Key.prop0,
                     prop1 = data.Key.prop1,
                     prop2 = (data.Select(x => x.prop2).FirstOrDefault(p => p == "XXX") ?? data.Select(x => x.prop2).First())
                 }).ToArray();

推荐阅读