Получилась следующая ситуация:
У меня два комплекта.«Список A» со следующими полями: ID, NAME, VALUES, где комбинация ID и NAME уникальна, и «список B», который содержит ID, NAME, OVERRIDEN_VALUES.
То, что я хочу получить, - это machпредметы в обоих списках в кратчайшие сроки.
Текущая реализация ниже:
1) У меня есть следующий поиск, в котором ключи могут содержать только NAME, только ID или оба (и возможны дубликаты)
var lookup = overrides
.ToLookup(item => new OverrideKey(item.NAME, item.ID));
2) Реализация OverrideKey:
public class OverrideKey
{
public OverrideKey(string name= null, string id= null)
{
NAME = name ?? string.Empty;
ID = id ?? string.Empty;
}
public string NAME { get; private set; }
public string ID { get; private set; }
public override bool Equals(object obj)
{
var otherKey = obj as OverrideKey;
return !ReferenceEquals(otherKey, null) &&
(NAME == otherKey.NAME|| ID == otherKey.ID);
}
public override int GetHashCode()
{
var hashCode = 17;
hashCode = (hashCode * 37) ^ ID.GetHashCode();
hashCode = (hashCode * 37) ^ NAME.GetHashCode();
return hashCode;
}
}
3) Тогда у меня есть список элементов для сопоставления, для которых я должен найти все совпадения из поиска переопределений
foreach (var item in itemsToMach)
{
var matchingOverrides = overrides[new OverrideKey(name: item.NAME)]
.Union(overrides[new OverrideKey(id: item.ID)])
.Union(overrides[new OverrideKey(item.NAME, item.ID)]);
[do stuff]
}
Что меня беспокоитв том, что в пункте 3) я должен создать там ключи для каждого отдельного элемента в itemsToMatch, и трудно поверить, что это не может быть сделано более эффективно, но, к сожалению, в настоящее время я не умею.
ОБНОВЛЕНИЕ Предоставление входного образца:
выборочные переопределения (пусто = любое)
PROPERTY ORIGINAL_VALUE OVERRIDE_VALUE NAME ID
A 16 13 SMH19
A 16 13 SMZ18
B CRE BKP350LDN6589897
B CCC TABAU_USD_DFS_MR14
A 4 10 28905418 TABAU_USD_DFS_MR14
A 4 10 107029271 TABAU_USD_DFS_MR14
C RES 1 106863631 XSNOREFOBL00
Пример "ItemsToMatchWith"
NAME ID A B C
XDSFD SMH19 16 RTRE DDF33X <- this row should be matched with 1st row from table above cause ID is matching
107029271 TABAU_USD_DFS_MR14 4 YTY TTD <- this row should be matched with 4th and 6th row from first table
107029271 BLY_UU_OMO6 43 CCCTR CVBTW <- this row shouldn't be matched with anything cause even while there is
override with the same NAME that override requires also to have matching ID