KeyValuePair
фактически используется только для Dictionary
с.Я предлагаю создать свой собственный тип:
public class MyRow
{
public string StringValue {get;set;}
public double DoubleValue {get;set;}
public override bool Equals(object o)
{
MyRow r = o as MyRow;
if (ReferenceEquals(r, null)) return false;
return r.StringValue == this.StringValue && r.DoubleValue == this.DoubleValue;
}
public override int GetHashCode()
{
unchecked { return StringValue.GetHashCode ^ r.DoubleValue.GetHashCode(); }
}
}
и сохранить файлы в списках этого типа:
List<MyRow> firstFile = ...
List<MyRow> secondFile = ...
Тогда вы сможете определить пересечение (все элементы, которые встречаются в обоих списках) через метод LINQ Intersect
:
var result = firstFile.Intersect(secondFile).ToList();
Необходимо переопределить Equals
и GetHashCode
, потому что в противном случае Intersect
сделает только ссылка сравнение.В качестве альтернативы вы можете реализовать собственный IEqualityComparer<MyRow, MyRow>
, который выполняет сравнение и передать его соответствующей перегрузке Intersect
.
Но если вы можете убедиться, что ключи (строковые значения являются уникальными), вы также можете использовать
Dictionary<string, double> firstFile = ...
Dictionary<string, double> secondFile = ...
И в этом случае использовать этот оператор LINQ:
var result = new Dictionary<string, double>(
firstFile.Select(x => new { First = x, Second = secondFile.FirstOrDefault(y => x.Key == y.Key) })
.Where(x => x.Second?.Value == x.First.Value));
, который имел временную сложность O (m + n) тогда как верхним решением будет O (m * n) (для m и n - количество строк в двух файлах).