Используя Linq, вы можете сделать следующее:
var rows = new string[][]
{
new string[] {"John", "Apple", "Orange", "Banana"},
new string[] {"John", "Apple", "Orange", "Banana"},
new string[] {"John", "Apple", "Lemon", "Banana"},
new string[] {"John", "Apple", "Orange", "Grape"},
new string[] {"Sam", "Apple", "Orange", "Banana"},
new string[] {"Sam", "Apple", "Orange", "Banana"},
};
var results = (from f in rows
where f.Contains("Sam")
select f).Distinct(new ArrayComparer());
Однако для этого необходимо создать специальный класс сравнения следующим образом:
class ArrayComparer : IEqualityComparer<string[]>
{
public bool Equals(string[] x, string[] y)
{
if (x.Length != y.Length)
return false;
var left = x.OrderBy(s => s).ToArray();
var right = y.OrderBy(s => s).ToArray();
for (int index = 0; index < x.Length; index++)
{
if (left[index] == right[index])
{
continue;
}
else
{
return false;
}
}
return true;
}
public int GetHashCode(string[] obj)
{
int hash = 23;
foreach (var element in obj.OrderBy(s => s))
{
hash = hash * 37 + element.GetHashCode();
}
return hash;
}
}
Результат использования Джона будет 3 строки, а результаты с Сэмом будут 2 строки. Если вы хотите игнорировать регистр, вам просто нужно изменить OrderBy(s => s)
на OrderBy(s => s, StringComparer.OrdinalIgnoreCase)