Как сопоставить элементы на основе дополнительных свойств - PullRequest
0 голосов
/ 28 февраля 2019

Получилась следующая ситуация:

У меня два комплекта.«Список 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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...