Porovnání dvou objektů   otázka

Algoritmy, .NET

Dobrý den, řeším porovnání dvou objektů tak, aby byly porovnávány pouze hodnoty vlastností objektu a ne reference.

Objekt obsahuje vlastnosti typu:

string

List<objekt>

Lze porovnat přímo celý objekt, nebo se musí porovnávat jednotlivé vlastnosti ve vlastní metodě?

Pro porovnání List<object> musím vytvořit vlastní comparer nebo lze použít nějakou vhodnou metodu?

Předem děkuji

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Musí se porovnávat všechny hodnoty ale k usnadnění slouží rozhraní IEquatable(T) které implementujete ve své třídě a potom pro porovnání slouží metoda Equals. Pro efektivní porovnávání prvků v kolekci by šel použít LINQ nebo napsat si vlastní comparer.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Objekty jsou XmlSerializable() a tak mě napadlo jestli by nešlo ten objekt načíst do textového dokumentu a pak je porovnat jen jako stringy.

Nepřišel jsem, ale na způsob jak z objektu v paměti vytvořit přímo textový dokument bez zápisu do souboru.

Používám XmlSerializer.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ad porovnání přes XML: to bude strašně pomalé a neefektivní.

Ad XML serializace do paměti: můžete využít memorystream

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Děkuji mnohokráte za cenné rady.

Načtení dat do stringů jsem vyřešil:

public string Serial2String()
        {
            StringWriter sw;
            XmlSerializer ser = new XmlSerializer(typeof(MujObject), "MujObject");
            using (sw = new StringWriter())
            {
                ser.Serialize(sw, this);
            }
            return sw.ToString();
        }

protože objekty jsou řádově ve velikostech max. stovek kB tak to porovnávání tímto způsobem se nezdá jako problém. Prozatím v rychlosti vyzkoušeno a funguje to jak má.

Všem děkuji

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To bych potom zkusil radeji porovnat vysledky binarni serializace pomoci nejakeho hashe. Kdyz jsem naposled zkusil XML serializaci nahradit binarni byl jsem mile prekvapen vykonem a velikosti ciloveho souboru.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Máte namysli GetHashCode() ?

To mi nefungovalo. Negeneruje to náhodou hodnotu v závislosti i na referencích?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Přesně tak. Pokud nepřepíšete GetHashCode vlastním algoritmem (což se doporučuje například při implementaci rozhraní IEquatable), vrací hodnoty vypočítané na základě referencí.

Nechápu ale, proč se tady snažíte vymyslet taková nehorázná a komplikovaná řešení, když by to šlo naprosto efektivně řešit mnou navrhovanou metodou implementace IEquatable + Equals.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Řešení s porovnáváním objektů převedených do stringů mě prozatím plně vyhovuje. S rychlostí nemám v tomto případě naprosto žádný problém a tak nevidím důvod proč řešit další "práci navíc" s

implementováním IEquatable (znamená to pro mě také i více tuto impl. nastudovat).

Nebo možná v tuto chvíli nevidím nedostatky tohoto řešení?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Uvidíte v budoucnu.

XML serializace je velice omezující záležitost co se týče OOP možností (pouze defaultni konstruktory, apod.). Až budete potřebovat rozšířit Váš objektový model tímhle směrem, řešení na výše postaveném se vám sesype a potom vás to bude stát mnohem více času.

BTW: myslím, že dobré programy od těch špatných rozlišuje právě kód který je uvnitř, i když obě kategorie jsou navenek funkční

nahlásit spamnahlásit spam 0 odpovědětodpovědět

spíše jsem mel namysli nejakou hashovaci funkci z System.Security.Cryptography

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Přesně tak, nejdříve porovnat ten string, potom počet prvků v kolekci a nakonec kolekci samotnou. Snadno tak lze imp. i např. ignorace velikosti písmen.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback