Triet Pham
Triet Pham

Reputation: 88

Group by with special conditions of values result in Linq c#

I need to filter values result when Group by with key prop0, prop1

What i did was try to add conditions on select when Group by but don't work with error as follows:

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

This is my code

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();
}

Original list

{ 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 }

=> Result i want

{ 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 }

Upvotes: 0

Views: 59

Answers (2)

Triet Pham
Triet Pham

Reputation: 88

With the help of Ipsit Gaur, i had the complete answer

 

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();

Upvotes: 0

Ipsit Gaur
Ipsit Gaur

Reputation: 2927

Simply check for the first object with "XXX" value, if not found then get the first value

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();

Upvotes: 2

Related Questions