Muszę zapisać 2 wartości na jednej liście, więc mam wszystkie pozycje I moje kontrolki mojej tablicy na jednej liście. Użyłem słownika, ale odkryłem, że istnieje tylko jedno mapowanie drogi. Czy ktoś ma jakieś zalecenia poza dwuwymiarową tablicą?Lista odwzorowań dwukierunkowych
Odpowiedz
Można używać słownika dość łatwo jako dwukierunkowy mapowania jeśli nie dbają o liniowym wydajności wyszukiwania dla odwrotnego mapowania (które można dostać z 2D tablicy w każdym razie):
var dictionary = new Dictionary<string, int>();
// Fill it up...
int forwardMapResult = dictionary["SomeKey"];
string reverseMapResult = dictionary.Where(kvp => kvp.Value == 5).First().Key;
Jeśli szybkość wyszukiwania jest problemem, musisz zachować dwa słowniki - jeden do wyszukiwania do przodu, a drugi do odwrotnego. Lub użyj in-memory, indeksowanej bazy danych, takiej jak SQLite.
To może pomóc:
public class BiDirectionalDictionary<L, R>
{
private readonly Dictionary<L, R> leftToRight = new Dictionary<L, R>();
private readonly Dictionary<R, L> rightToLeft = new Dictionary<R, L>();
public void Add(L leftSide, R rightSide)
{
if (leftToRight.ContainsKey(leftSide) ||
rightToLeft.ContainsKey(rightSide))
throw new DuplicateNameException();
leftToRight.Add(leftSide, rightSide);
rightToLeft.Add(rightSide, leftSide);
}
public L this[R rightSideKey]
{ get { return rightToLeft[rightSideKey]; } }
public R this[L leftSideKey]
{ get { return leftToRight[leftSideKey]; } }
public bool ContainsKey(L leftSideKey)
{ return leftToRight.ContainsKey(leftSideKey); }
public bool ContainsKey(R rightSideKey)
{ return rightToLeft.ContainsKey(rightSideKey); }
}
[Serializable]
public class DuplicateNameException : SystemException
{
protected DuplicateNameException(
SerializationInfo info, StreamingContext context);
public DuplicateNameException();
public DuplicateNameException(string s);
public DuplicateNameException(string message,
Exception innerException);
}
To ma problemu, jeśli lewa i prawa strona są tego samego typu ... to znaczy, że nie działa w porządku, jeśli spróbujesz
var myBiDireDict = new BiDirectionalDictionary<DateTime, DateTime>();
Bardzo dobre założenie, że L i R nie są tego samego typu i zawsze istnieje relacja 1: 1. –
- 1. Najprostszym sposobem na usunięcie dwukierunkowych relacji rekurencyjnych?
- 2. CXF i wiele odwzorowań serwletów
- 3. Tablica odwzorowań wielu do wielu
- 4. Adnotacje JAXB - Interfejsy odwzorowań i @XmlElementWrapper
- 5. Jak określić kolejność odwzorowań filtrów na GlassFish?
- 6. Wykorzystanie w świecie rzeczywistym dwukierunkowych generatorów w javascript
- 7. Korzystanie Eclipse na Mac i klawisz Alt w odwzorowań
- 8. Jak załadować tylko identyfikatory z wielu do wielu tabel odwzorowań?
- 9. Tabela odwzorowań JPA/Hibernate dla relacji Jeden do wielu
- 10. Uzyskiwanie długości kolumny z odwzorowań w trybie hibernacji?
- 11. NHibernate: Jak zmienić konfigurację odwzorowań w środowisku wykonawczym?
- 12. Różnica między zamkiem (lista) i zamek (* lista)
- 13. C++ Lambdas: lista przechwytywania a lista parametrów
- 14. Aktualizowanie (od strony odwrotnej) dwukierunkowych relacji wiele do wielu w Doctrine 2?
- 15. pełna lista mime-type <-> mapowanie rozszerzeń plików
- 16. Lista mnożenie
- 17. lista wyboru
- 18. Intent.putExtra Lista
- 19. Lista <Object> i Lista <?>
- 20. Dlaczego lista [:: - 1] nie równa się [: len (lista): - 1]?
- 21. Dlaczego lista i lista przyjaciół nie jest przestarzała?
- 22. Rvm i klejnoty, lista pakietów i lista klejnotów
- 23. Lista REST WCF Lista nagłówków HTTP dla przychodzących żądań
- 24. Django admin Lista wyświetlania + ForeignKey = Pusta lista zmian
- 25. Lista transformacji do mapy elementu -> lista (element) w scala
- 26. Bash, lista Segment argumentem
- 27. Lista Java vs ArrayList
- 28. Lista użytkowników PostgreSQL
- 29. lista Postgres ENUM Typ
- 30. Lista klas w zespole
Chcesz przechowywać 2 różne typy w jednej kolekcji? –
Tak, właśnie to chcę robić! –