Reputation: 88
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
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
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