Получение сущности из ассоциативного списка по 2 идентификаторам

Вопрос:

Я пытаюсь использовать метод Find из списка или другой, похожий на тот, который я хочу сделать. У меня есть 2 объекта и ассоциативный объект, который имеет идентификаторы и свойства от каждого независимого объекта. Я хочу найти объект внутри ассоциативного списка, но для комбинации из обоих идентификаторов объектов… что-то вроде этого.

        //Entity1 attributes int ID, string NAME
List<Entity1> listEntity1 = new List<Entity1>();
listEntity1.Add(new Entity1(1, "A"));
listEntity1.Add(new Entity1(2, "B"));
listEntity1.Add(new Entity1(3, "C"));
listEntity1.Add(new Entity1(4, "D"));
listEntity1.Add(new Entity1(5, "E"));
listEntity1.Add(new Entity1(6, "F"));

//Entity2 attributes int ID, string NAME
List<Entity2> listEntity2 = new List<Entity2>();
listEntity2.Add(new Entity2(101, "AA"));
listEntity2.Add(new Entity2(102, "BB"));
listEntity2.Add(new Entity2(103, "CC"));
listEntity2.Add(new Entity2(104, "DD"));
listEntity2.Add(new Entity2(105, "EE"));
listEntity2.Add(new Entity2(106, "FF"));

//Entity1_2 attributes int ID from Entity1, int ID from Entity2
List<Entity1_2> listIntermediate = new List<Entity1_2>();
listIntermediate.Add(new Entity1_2(1, 101));
listIntermediate.Add(new Entity1_2(1, 103));
listIntermediate.Add(new Entity1_2(2, 103));
listIntermediate.Add(new Entity1_2(4, 101));
listIntermediate.Add(new Entity1_2(4, 106));
listIntermediate.Add(new Entity1_2(5, 106));
Account

Entity1_2 entity1_2 = listIntermediate.Find( by ID1 and ID2 ) and get the object Entity1_2 that has the info from both Entities

Спасибо.

Лучший ответ:

Объедините клавиши:

var dict = new Dictionary<string, Entity>();
dict.Add("1;A", new Entity(1, "A"));

Entity e;
If (dict.TryGetValue("1;A", out e)) {
    Use(e);
}

Если вы можете интегрировать метод public string GetKey() в объекты, которые были бы замечательными.

var e = new Entity(1, "A");
dict.Add(e.GetKey(), e);

Также интегрируйте статический метод

public static string GetKey(int id, string name)
{
    return ...;
}

а затем получить результаты, подобные этому

Entity e;
If (dict.TryGetValue(Entity.GetKey(1, "A"), out e)) {
    Use(e);
}

Обратите внимание, что словарь имеет гораздо более быстрое время доступа при получении ключом, чем список. В обозначениях большой O:

Dictionary<TKey, TElement>:   O(1)
List<T>:                      O(n)

Если вам нужно сохранить свои данные в списке, найдите информацию с помощью:

Entity e = list
    .Where(x => x.ID == id && x.Name == name)
    .FirstOrDefault();

if (e != null) {
    Use(e);
}

Или используйте метод Find List<T>

Entity e = list.Find(x => x.ID == id && x.Name == name);
if (e != null) {
    ...
}

Он должен быть немного быстрее, чем подход LINQ с Where, но все же O(n).

Оцените статью
TechArks.Ru
Добавить комментарий