Не уверен, что это именно то, к чему вы стремитесь, потому что ваш вопрос труден для понимания, и кажется, что данные вашего примера могут содержать несколько опечаток. Тем не менее, я смоделировал нечто подобное для вас ниже. Обратите внимание, что я изменил строку 1, потому что похоже, что у вас была опечатка, и я изменил строку 5, чтобы это на самом деле было исключенным случаем, в противном случае вы получили бы все.
public class Test
{
public int Row {get; set;}
public int ID {get; set;}
public string Match {get; set;}
public string Value {get; set;}
public int Equal {get; set;}
public int Group {get; set;}
}
void Main()
{
var items = new List<Test>();
items.Add(new Test() {Row = 1, ID = 1, Match = "a", Value = "a", Equal = 1, Group = 1});
items.Add(new Test() {Row = 2, ID = 1, Match = "a", Value = "b", Equal = 0, Group = 1});
items.Add(new Test() {Row = 3, ID = 2, Match = "a", Value = "a", Equal = 1, Group = 2});
items.Add(new Test() {Row = 4, ID = 3, Match = "b", Value = "c", Equal = 0, Group = 3});
items.Add(new Test() {Row = 5, ID = 4, Match = "a", Value = "b", Equal = 1, Group = 4});
var result = items.GroupBy(i => i.Group)
.Where(g => g.All(t =>
(t.Equal == 1 && t.Match == t.Value) ||
(t.Equal == 0 && t.Match != t.Value)))
.SelectMany(g => g.Select(i => i));
foreach (var i in result)
{
Console.WriteLine("Row: {0}, ID: {1}", i.Row, i.ID);
}
}
Результат:
Row: 1, ID: 1
Row: 2, ID: 1
Row: 3, ID: 2
Row: 4, ID: 3