Что могло использоваться в качестве двухстороннего Словаря Ресурса?

Это очень возможно и быстрее (при правильном использовании, об этом позже)
И вот как вы можете это сделать:

var context1 = new DbContext();
_fooList = new List<Foo>
{
    // Thousands of datasets
}

context1.Set<Foo>().AddRange(_fooList);

var context2 = new DbContext();
_barList = new List<Bar>
{
    // Thousands of datasets
}

context2.Set<Bar>().AddRange(_barList);

var fooTask = context1.SaveChangesAsync();
var barTask = context2.SaveChangesAsync();

await Task.WhenAll(new Task[] {fooTask, barTask});

Это быстрее, чем иметь один Запись контекста в одну таблицу, а затем в следующую, но если вы делаете это для той же таблицы, это может быть на самом деле медленнее, чем делать это с 1 Context

6
задан Totty 18 November 2008 в 19:37
поделиться

2 ответа

Не встроенный, но это довольно легко записать. Я, вероятно, реализовал бы IDictionary для этого хотя... Вы затем вывели бы ResourceDictionary в свой пользовательский тип.

public class DoubleLookup<TKey, TValue>
{
  private IDictionary<TKey, TValue> keys;
  private IDictionary<TValue, TKey> values;

  //stuff...

  public void Add(TKey key, TValue value)
  {
    this.keys.Add(key, value);
    this.values.Add(value, key);
  }

  public TKey GetKeyFromValue(TValue value)
  {
    return this.values[value];
  }

  public TValue GetValueFromKey(TKey key)
  {
    return this.keys[key];
  }


}
7
ответ дан 10 December 2019 в 02:55
поделиться

Будьте очень осторожны при инвертировании отношений ключа/значения в словаре.

Контракт словаря гарантирует, что для каждого значения в наборе существует точно один ключ, который отображается на то значение. Ключи уникальны. Но реверс не верен; для каждого отличного значения может быть много различных ключей, отображающихся на то значение.

В моей собственной персональной библиотеке кода (записанный в Java, который достаточно близок), у меня есть Мультикласс сопоставления для просто такого рода вещи. Хотя ключи уникальны, каждый ключ может быть связан с несколькими значениями. Это точно идентично Карте>.

Когда я должен выполнить поиски значения к ключу в наборе, я делаю что-то вроде этого:

Map<K, V> lookupTable = ...;
MultiMap<V, K> reverseLookupTable = MapUtil.invert(lookupTable);

V value = ...;
if (reverseLookupTable.containsKey(value)) {
   Set<K> keys = reverseLookupTable.get(value);
}

При использовании чего-то другого, чем MultiMap (как HashMap или Словарь) как обратная справочная таблица Вы рискуете терять некоторые свои V-> K отображения, если Вы не можете гарантировать, что все ключи И все значения в Вашем наборе уникальны.


Править:

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

2
ответ дан 10 December 2019 в 02:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: