dnes jsme měli kontingenční tabulku, viz http://forum.matfyz.info/viewtopic.php? ... ni+tabulka.
Hlavní funkcionalitu jsem měl hotovou za 2 hodiny, takže 3 hodiny byly vážně luxusní čas na odladění drobností. Odcházel jsem po 2,75 hodinách a byl jsem 3. úspěšný z 10, dále nevím.
Moje řešení spočívalo v nagenerování sloupců dle záhlaví a pak pro každý řádek vstupu vytvořit řádek a do něj dát datové položky typu {hodnota, odpovídající reference na sloupec}
Pak jsem si do záhlaví určil, zda celý sloupec splňuje požadavek na typ - vše čísla (kvůli okamžité vazbě, zda přes tento sloupec můžu sčítat), nebo zda jsou to obecné textové řetězce.
Následně jsem si vygeneroval dotazovací řádky dle zadaných sloupců (ty, podle kterých jsme měli seskupovat) tak, abych rekurzí pracoval s již omezenou množinou dat nad dalším omezujícím sloupcem. (Pokud znáte IQueryble<T>, tak jsem vycházel z podobného principu - průběžně sestavovat dotaz a pak jednou šáhnout do dat)
Kód: Vybrat vše
class QueryRow
{
public List<TableRow> Source {...}
public string Filter {...}
public List<QueryRow> SubItems {...}
}
Kód: Vybrat vše
internal List<QueryRow> GetSubitems(QueryRow parent, List<Column> desiredColumns, int level)
{
var result = new List<QueryRow>();
//nacti unikatni hodnoty - ze vsech predfiltrovanych radku otce si nacti hodnoty v danym sloupci a vem je unikatne
var unique = parent.Source.Select(e=> (e.GetColumn( desiredColumns[level].ColumnName).Value)).Distinct().ToList();
foreach(var name in unique)
{
//vytvor novy QueryRow qRow;
//nastav mu jako Source takove radky z parent.Source, ktere splnuji to, ze ve sloupci desiredColumns[level] maji hodnotu name;
//nastav qRow.Filter = name //slouzi pro vypisovani na vystup
// pokud desiredColumns.Length > level, tak mu pridej SubItems = GetSubitems( qRow, desiredColumns, level +1)
// pridej qRow do resultu
}
return result;
}
Až se dostanu ke svému řešení (má ho PJ a neměli jsme net, takže si ho nechám poslat), tak ho zde dám.
EDIT 23.1.2014: Po konzultaci s PJ ho zde dávat nebudu, nicméně s mojí nápovědou to jistě zvládnete.
Jinak klasika - k dispozici pouze lokální MSDN, router byl odstřihnut, takže bez netu, mohli jsme mít tištěné materiály.