Группировка с особыми условиями значений приводит к Linq c # - PullRequest
0 голосов
/ 25 января 2019

Мне нужно отфильтровать значения результата, когда 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 }

Ответы [ 2 ]

0 голосов
/ 25 января 2019

С помощью Ipsit Gaur у меня был полный ответ

1003 *

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()),
               prop3 = data.Where(p => p.prop2 == "XXX").FirstOrDefault() != null ? data.Where(p => p.prop2 == "XXX").Select(x => x.prop3).FirstOrDefault() : data.Select(x => x.prop3).First(),
           }).ToArray();
0 голосов
/ 25 января 2019

Просто проверьте первый объект со значением "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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...