IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Ondra Toman
Člen
Avatar
Ondra Toman:16.4.2020 14:48

běžně pokud mám nějaké vícerozměrné pole tak na jednotlivé prvky v poli ukazuji pomocí souřadnic např. data[1, 2, 3], ale potřeboval bych místo třech složek vkládat přímo trojsložkový vektor např. data[vector]. jediný způsob jak to obejít je data[vector.h1, vector.h2, vector.h3] což je dost zdlouhavé. jde nějak přepsat definice toho pole nebo tak něco?

 
Odpovědět
16.4.2020 14:48
Avatar
Bugmaster
Člen
Avatar
Bugmaster:16.4.2020 23:10

K tomuhle účelu běžně používám Dictionary, kde klíč je ten vektor/identi­fikátor.

Ale pozor:
Aby to fungovalo, musíš udělat jednu ze dvou věcí (a jen jednu, nedělj naráz):

  1. Třída identifikátoru/vek­toru musí definovat vlastní metody GetHashCode() a Equals().
  2. Vytvořit valstní třídu implementujíci IEqualityCompa­rer. Tanhle comparer pak použiješ při vytváření Dictionary - stačí použít příslušný konstruktor

A ještě jeden hodně důležitý pozor:
V obou případech budeš implementovat dvě funkce: jedna, která ti porovnává a jedna, která ti vrací hash.
Tady musíš mít na paměti dvě důležité věci:

  • Objekty, které jsou stejné, musí mít stejný hash.
  • To, že jsou stejné hashe, nutně neznamená, že jsou objekty stejné.

Když tohle nedodržíš, otevřou se brány pekelné a dvě procenta pekla pochcípá na COVID19 (tj. budou se dít nevysvětlitelný věci za těžko defnovatelných okolností v momentě, kdy to nečekáš).

Tohle je případ, kdy se velmi pozorně vyplatí přečíst si v dokumentaci Notes to implementers

Taky je dobrý chápat, jak funguje hashovací tabulka (v dotnetu aka Dictionary). Díky tomu pochopíš, proč je dobrý napad zajisti výše zmíněné.

Visual Studio (2019) tyhle metody umí naštěstí vygenerovat automaticky (pro případ č. 1). Celkem to funguje (tj. zatím jsem si nevšim, že by to nefungovalo). Stačí kliknout pravym na název třídy (nebo ctrl + .) a zvolit Quick actions and refactoring > Generate GetHashCode and Equals.

Výsledek pak může vypadat takto:

class Id : IEquatable<Id>
{
  public Id(int a, int b, int c)
  {
    A = a;
    B = b;
    C = c;
  }

  public int A { get; }

  public int B { get; }

  public int C { get; }

  public override bool Equals(object obj)
  {
    return Equals(obj as Id);
  }

  public bool Equals(Id other)
  {
    return other != null &&
           A == other.A &&
           B == other.B &&
           C == other.C;
  }

  public override int GetHashCode()
  {
    return HashCode.Combine(A, B, C);
  }

}

V principu to není složitý, ale opravdu se vyplatí vědět, co děláš (ehhm... mluvím z vlastní zkušesnoti).

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
16.4.2020 23:10
Avatar
Ondra Toman
Člen
Avatar
Odpovídá na Bugmaster
Ondra Toman:17.4.2020 0:32

"opravdu se vyplatí vědět, co děláš"... Dobře tak já si tvůj příspěvek odložím na pár dní stranou a jdu studovat, protože jsem pochopil asi 10% z toho co jsi mi napsal :D
Každopádně díky za nasměrování.

 
Nahoru Odpovědět
17.4.2020 0:32
Avatar
Odpovídá na Ondra Toman
Patrik Valkovič:17.4.2020 1:07

A nestačila by k tomu nějaká extension metoda?

using System;
using System.Collections.Generic;

public static class ArrayExtension
{
        public static int AccessUsingList(this int[,,] pole, List<int> vektor)
        {
                return pole[vektor[0], vektor[1], vektor[2]];
        }
}

public class Program
{
        public static void Main()
        {
            int[,,] array = new int[10,10,10];
            array[5,4,3] = 12;

            List<int> access = new List<int>();
            access.Add(5);
            access.Add(4);
            access.Add(3);

            int value = array.AccessUsingList(access);

                Console.WriteLine(value);
        }
}

Tohle je samozřejmě jenom příklad, chtělo by to přidat nějakou generiku, aby to umožnilo různé typy a třeba i různý počet dimenzí, ale myšlenku to demonstruje.

Nahoru Odpovědět
17.4.2020 1:07
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Ondra Toman
Člen
Avatar
Odpovídá na Patrik Valkovič
Ondra Toman:17.4.2020 12:12

Napadlo mě to, ale doufal jsem že to půjde nějak hezčeji.

 
Nahoru Odpovědět
17.4.2020 12:12
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.