Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  C# classi küsimus märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
mine lehele 1, 2  järgmine
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
spreiii
HV kasutaja

liitunud: 27.12.2008




sõnum 12.03.2012 18:29:19 C# classi küsimus vasta tsitaadiga

Kõigepealt üritan selgeks teha, mida ma saavutada üritan:
Funktsioonis Main genereeritakse nelja linna jaoks kolme kuu kohta iga päeva keskmine õhutemperatuur.
Linnad hoitakse enum'is nimega Cities.
c#:
  1. public enum Cities { Johvi, Narva, Tartu, Tallinn };

Täpsemalt teen seda nii:
c#:
  1.             // Genereerime ilma andmed iga linna jaoks
  2.             for (int i = 0; i < sizeof(Cities); i++)
  3.             {
  4.                 // Genereerime andmed 3 kuu jaoks (jaanuar, veebruar, märts) 2012
  5.                 for (int j = 1; j <= 3; j++)
  6.                 {
  7.                     // Genereerime andmed iga päeva jaoks kuus
  8.                     for (int m = 1; m <= DateTime.DaysInMonth(2012, j); m++)
  9.                     {
  10.                         string m_temp = "";
  11.                         if(m < 10) m_temp = "0";
  12.                         Random random = new Random();
  13.  
  14.                         string kuupaev = "0"+j+"/"+m_temp + m+"/2012";
  15.                         new Weather(Enum.GetName(typeof(Cities), i), kuupaev, random.Next(-16, 2));
  16.                     }
  17.                 }
  18.  
  19.                 Console.WriteLine("OK: Andmed genereeritud linna {0} jaoks!", Enum.GetName(typeof(Cities), i));
  20.             }

Nagu koodist näha, luuakse uus "Weather", mille sisu on:
c#:
  1. class Weather {
  2. public Weather(string linn, string kp, double kesktemp)
  3.         {
  4.             this.linn = linn;
  5.             this.kp = kp;
  6.             this.kesktemp = kesktemp;
  7.         }
  8. }


Andmete genereerimine iseenesest töötab. Küsimus oleks selline, et millisel viisil saaksin ma Weather classi sees iga tekitatud objekti läbi kammida?
Kas saab class'i sees luua uue array, mis sisaldab neid objekte?
Kommentaarid: 23 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 23
tagasi üles
vaata kasutaja infot saada privaatsõnum
neros
HV Guru
neros

liitunud: 26.11.2003




sõnum 12.03.2012 21:27:52 vasta tsitaadiga

Sul on tarvis kusagil hoida need tekitatud muutujad. Hetkel sa teed lihtsalt uue Weather objekti (new Weather(Enum...)) ja ta lihtsalt "hõljub õhus". Sa võiksid näiteks endale teha sellise klassi:


public class WeatherData {
    public List<Weather> Weathers {get; set;}
}


Siis lükid listi iga kord kui objekti teed:


var weatherData = new WeatherData();

<loop siin>
...
weatherData.Weathers.Add(new Weather(Enum.GetName(typeof(Cities), i), kuupaev, random.Next(-16, 2));


Ja siis saad läbi käia näiteks:

foreach(var data in weatherData.Weathers) {
    ... do something with data
}

_________________
GitHub
.NET Core & Azure baasil lahendused ja arhitektuur - kontakt.
Kommentaarid: 48 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 40
tagasi üles
vaata kasutaja infot saada privaatsõnum
spreiii
HV kasutaja

liitunud: 27.12.2008




sõnum 12.03.2012 22:47:28 vasta tsitaadiga

Suured tänud, thumbs_up.gif
Üks probleem siiski on - rida
c#:
  1. weatherData.Weathers.Add(new Weather("Test", "12/03/2012", 3));

annab veateate
Unhandled exception: System.NullReferenceException: Object reference not set to an instance of an object.
Kommentaarid: 23 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 23
tagasi üles
vaata kasutaja infot saada privaatsõnum
Ho Ho
HV Guru
Ho Ho

liitunud: 16.02.2002




sõnum 12.03.2012 23:18:53 vasta tsitaadiga

Kusagil on miski muutuja loomata. Ise pakun, et kas weatherData või tolle Weathers list.
_________________
Teach a man to reason and he'll think for a lifetime
Common sense - so rare that it's a damn superpower
Vaadates paljude inimeste sõnavõtte siin ja mujal jääb üle ainult klassikuid tsiteerida - "I weep for humanity"
Kommentaarid: 106 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 86
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
spreiii
HV kasutaja

liitunud: 27.12.2008




sõnum 13.03.2012 00:22:14 vasta tsitaadiga

Olen suurem osa koodist välja kommenteerinud, et testida:
Main()
c#:
  1.        static void Main(string[] args)
  2.         {
  3.             var weatherData = new WeatherData();
  4.             weatherData.Weathers.Add(new Weather("Test"));
  5.        }

WeatherData
c#:
  1.     public class WeatherData
  2.     {
  3.         public List<Weather> Weathers { get; set; }
  4.     }

Weather
c#:
  1.     public class Weather
  2.     {
  3.         // Linn
  4.         public string linn
  5.         {
  6.             get;
  7.             set;
  8.         }
  9.  
  10.         // Konstruktor ilma parameetriteta
  11.         public Weather()
  12.         {
  13.             linn = "Puudub";
  14.         }
  15.         // Konstruktor parameetritega
  16.         public Weather(string linn)
  17.         {
  18.             this.linn = linn;
  19.         }
  20. }

Ilmselgelt tegin ma kuskil vea, kuid ei suuda seda oma C# kogemuste põhjal tuvastada icon_sad.gif

EDIT:
Selline versioon töötab, kuid seda ainult Main-is. Kui samu andmeid Weather class'is tahan kasutada, nullitakse genereeritud andmed, kuna pean looma uue weatherData.
c#:
  1.     public class WeatherData
  2.     {
  3.         private List<Weather> weathers = new List<Weather>();
  4.         public List<Weather> Weathers { get { return weathers; } set { weathers = value; } }
  5.     }
Kommentaarid: 23 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 23
tagasi üles
vaata kasutaja infot saada privaatsõnum
neros
HV Guru
neros

liitunud: 26.11.2003




sõnum 13.03.2012 08:02:00 vasta tsitaadiga

Constructor võiks ka sellisel klassil olemas olla.

A la


class WeatherData
   {
      public WeatherData()
      {
         Weathers = new List<Weather>();
      }
      public List<Weather> Weathers { get; set; }
   }


http://pastebin.com/LYR9eysT

On kood millega ma just praegu testisin.

Ning samu andmeid saad igal pool kasutada. Tarvis on ainult muutujat kuhu sa kõik need andmed topid kas globalina või annad referentsina ette teisele funktsioonile.

_________________
GitHub
.NET Core & Azure baasil lahendused ja arhitektuur - kontakt.
Kommentaarid: 48 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 40
tagasi üles
vaata kasutaja infot saada privaatsõnum
spreiii
HV kasutaja

liitunud: 27.12.2008




sõnum 13.03.2012 12:10:52 vasta tsitaadiga

Õhtupoolikul proovin ära ning annan teada kuidas õnnestus. icon_smile.gif
E: Sain varem ära proovitud.

Antud kood töötab, kuid probleem on selline, et mul on vaja andmetega töötamine realiseerida klassis Weather. Ehk siis näiteks otsida keskmine temperatuur kuu lõikes jne (ühesõnaga vaja kasutada foreach loop'i klassi Weather sees). Siis on ju vaja luua uuesti var _weatherData = new WeatherData(); ?
Ilma selleta tuleb NullReferenceException jällegi. Samas, kui teha nii nagu ma just mainisin (luua see uuesti), siis on vastav List tühi. icon_rolleyes.gif

Siinkohal küsiks, et kas on üldse võimalik Weather klassi sees andmetega töötada või seda ei saa mingil juhul teha?
Kommentaarid: 23 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 23
tagasi üles
vaata kasutaja infot saada privaatsõnum
Desmond5
HV kasutaja

liitunud: 14.09.2002




sõnum 13.03.2012 15:15:30 vasta tsitaadiga

Hmmh, väga väga raske on aru saada koodist, kui näidatakse ainult juppe.

Mõned märkused:

1. Random klassi initialiseerimine peab olema itereerivast koodist väljaspool, vastasel korral hakkavad tulemused kattuma.

2. Sizeof on unsafe keyword, ära kasuta seda juhul kui sa tõesti tead mis sa teed. Array või listi elementide hulga leidmiseks kasuta .Count() või .Length, enumeraatori elementide konverteerimiseks massiiviks kasuta alltoodud meetodit.

3. Kui sa juba kirjutad koodi eesti keeles, siis kasuta täpitähti (.NET ja Java toetavad enamus UTF8 poolt toetatud märki, kasvõi hieroglüüfe). See on ürgaegne tava paljudel jäänud C/C++/Pascal jms maailmast et täpitähti ei saa kasutada. Tänapäeval (st viimased 10 aastat) saab ja see on standardiks.

4. Kasuta õige asja jaoks õiget andmetüüpi. Kuupäev on DateTime mitte string. Kui sul on linn juba Enum, siis ära konverdi seda stringiks varasemalt.

5. Ole tähelepanelik kuhu sa ";" (semikooloni) paned. Nt public enum City { Jõhvi, Narva, Tartu, Tallinn }; <- siin ei peaks semikoolonit olema.
Semikoolon ei käi (erinevalt C/C++) C#/Java keeles klasside/structide/enumite definitsioonide järel.

Proovi näiteks midagi sellist (töötav kood):



using System;
using System.Collections.Generic;
using System.Linq;

namespace Weather
{
    public enum City { Jõhvi, Narva, Tartu, Tallinn }

    // Weather klassi üks kirje kirjeldab ühe linna temperatuuri teatud kuupäeval.
    // Siin ei saa ega TOHIKS teisi Weather kirjeid (Weathereid) näha.
    public class Weather
    {
        public City Linn { get; set; }
        public DateTime Kuupäev { get; set; }
        public double Kesktemp { get; set; }

        public Weather(City linn, DateTime kp, double kesktemp)
        {
            Linn = linn;
            Kuupäev = kp;
            Kesktemp = kesktemp;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            List<Weather> weathers = GenereeriAndmed();

            // Nüüd siinkohas saaksid sa näiteks keskmist temperatuuri leida, kuna sul on List<Weather> olemas.

            foreach (var weather in weathers)
            {
                Console.Out.WriteLine(weather.Linn + " - " + weather.Kuupäev.ToString("dd.MM.yyyy") +
                    " - " + weather.Kesktemp + " C");
            }

            Console.ReadLine();
        }

        public static List<Weather> GenereeriAndmed()
        {
            List<Weather> weathers = new List<Weather>();

            // Random peab üheselt initialiseeritud olema üle kõikide iteratsioonide kus sa seda välja kutsud.
            Random random = new Random();

            // Leia kõik linnad enum seest. Tegelikult oleks ilus kui linnad oleks eraldi klass ja siis sa hoiaks neid üldse Listis.
            // Ehk siis class Linn...ja hiljem List<Linn> jne. Enum ei tundu siinkohas hea praktika.
            IEnumerable<City> linnad  = Enum.GetValues(typeof(City)).Cast<City>();

            DateTime algus = new DateTime(2012,1,1);
            DateTime lõpp = new DateTime(2012,4,1).AddDays(-1);

            // Itereerime üle kõikide linnade
            foreach (var city in linnad)
            {
                // Itereerime üle kõikide kuupäevade vahemikus algus kuni lõpp (seda ei pea nii tegema, see mis sa enne tegid oli ka OK tegelikult).
                for(DateTime date = algus; date <= lõpp; date = date.AddDays(1))
                {
                    // Lisa uus Weather kirje.
                    Weather weather = new Weather(city, date, random.Next(-16, 2));
                    weathers.Add(weather);
                }
            }
           
            // Nüüd on linnade andmed genereeritud ning tagastame need tervikuna, et neid saaks hiljem kasutada.
            return weathers;
        }
    }
}




Aru ei saa ma sellest, mida sa mõtled selle all, et sul on vaja andmetega töötada klassis Weather. Ülaltoodud (ja minupoolt alltoodud) näites on võimalik Weather klassis töötada ainult ühe ilma kirjega, mitte kõikide ilmade andmetega. Kui sa tahad keskmist temperatuuri leida üle kõikide Weatherite vms, siis sa pead seda tegema (minu koodi näite põhjal) Weather massiiviga (List<Weather>). Ideaalne koht selleks on Main() protseduuris kohe peale GenereeriAndmed() väljakutsumist ja List<Weather> kättesaamist..

Kui sul muidugi on tingimus, et sa kohe kindlasti *pead* Weather klassis andmeid töötlema, siis sul tuleb luua public static globaalne muutuja (halb praktika) Program klassi sisse (see kus main on) ja seal siis GenereeriAndmed tulemusi hoida. Siis sa saad neile hiljem Weather klassi seest ligi. Aga see on tõesti tõesti väga halb praktika. Ma väga loodan, et sulle seda koolis ei õpetatud nii tegema.

Muidugi jah, keegi ei keela sul teha ka midagi sellist:


    public class Weather
    {
        public City Linn { get; set; }
        public DateTime Kuupäev { get; set; }
        public double Kesktemp { get; set; }

        public Weather(City linn, DateTime kp, double kesktemp)
        {
            Linn = linn;
            Kuupäev = kp;
            Kesktemp = kesktemp;
        }

        public void TöötleAndmeid(List<Weather> andmed)
        {
            //Siinkohas saad nüüd kõiki andmeid töödelda..kõikidele kirjetele saad "andmed" kaudu ligi,
            // ja käesolevale saad lokaalselt ligi. Aga miks sa seda tahaksid ?
        }
    }


Ja siis Main funktsioonis:


        static void Main(string[] args)
        {
            List<Weather> weathers = GenereeriAndmed();

            foreach (var weather in weathers)
            {
                weather.TöötleAndmeid(weathers);
            }

            Console.ReadLine();
        }


Aga iseasi mida see annab sulle..

Parem kirjelda oma probleemi paremini, mida sa üritad saavutada.
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
spreiii
HV kasutaja

liitunud: 27.12.2008




sõnum 13.03.2012 16:29:02 vasta tsitaadiga

Proovin seda töötavat koodi ka kohe, aga.. kui ausalt öelda, siis tegelikult probleem "koolis õpetatu" põhjal alguse saigi.
Mul olid kõik vajalikud funktsioonid (andmetega töötamine) realiseeritud juba Main'is (ülaltoodud koodis tõin ainult probleemse osa, mis tekkis pärast õppejõuga rääkimist) ja programm oli täiesti funktsionaalne.

Rääkides Random'ist, siis vea avastasin ka vahepeal, et ta ei tööta ja tõstsin ta loop-ist välja. icon_smile.gif

Väidetavalt oleks ma pidanud andmetega töötamise realiseerima Weather class'is(küsisin oma 2 korda üle, et kas ikka seal, mitte Main-is), mis tundus mulle juba esialgu imelik, aga noh.. see õppeaasta sai C#-ga otseselt algust tehtud ja ei olnud päris kindel ka, et mida saab teha seal ja mida mitte.

Kokkuvõtteks võib siis öelda nii palju, et... kurb, ülimalt kurb kui selliseid õpetajaid tänapäeval leidub, kes ei saa ise ka aru, mida tohib, mida ei tohi ja mis on halb praktika.
Kommentaarid: 23 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 23
tagasi üles
vaata kasutaja infot saada privaatsõnum
neros
HV Guru
neros

liitunud: 26.11.2003




sõnum 13.03.2012 18:52:15 vasta tsitaadiga

Weather klass on sinu koodi põhjal otsustades ainult tavaline struktuur. Sinna võib ju mingit loogikat kirjutada, aga see töötab ainult selle klassi enda muutujatega, privaat või mitte (v.a. juhul kui sa referentsi passid). Midagi muud sa sinna panna ei saa. Extension meetoditega saad muidugi igasugust nalja teha, aga tuu om natuke advancim topic icon_razz1.gif
_________________
GitHub
.NET Core & Azure baasil lahendused ja arhitektuur - kontakt.
Kommentaarid: 48 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 40
tagasi üles
vaata kasutaja infot saada privaatsõnum
Ho Ho
HV Guru
Ho Ho

liitunud: 16.02.2002




sõnum 13.03.2012 18:57:25 vasta tsitaadiga

Ma pigem ütleks, et hetkel on siit üks klass puudu mis nonde weather objektidega möllaks. Tehniliselt saab seda ka main'is teha aga hello world'ist vähe suurema asja puhul pole see kõige ilusam lahendus.
_________________
Teach a man to reason and he'll think for a lifetime
Common sense - so rare that it's a damn superpower
Vaadates paljude inimeste sõnavõtte siin ja mujal jääb üle ainult klassikuid tsiteerida - "I weep for humanity"
Kommentaarid: 106 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 86
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
spreiii
HV kasutaja

liitunud: 27.12.2008




sõnum 13.03.2012 19:09:45 vasta tsitaadiga

Nii, et see siiski on teostatav? Huvitav on asja juures see, et see ülesanne on pärit tegelikult "klassidega tutvumise" teemast. Ma väga loodan, et keegi adminitest/modedest ei arva, et tegu on "tehke mu kodutöö minu eest ära" teemaga. Kaugel sellest, ma üritan vaid leida lahendust sellele, kuidas oleks võimalik List-i genereerida andmed ning hiljem neid just eelpool toodud Weather klassis kasutada.

Sama lahendus puhtalt Main'is istudes töötab ideaalselt. Kui aga paluti meetodid Weather klassi tõsta, tekkiski teema põhiprobleem: kuidas oleks võimalik näiteks Main'is andmed genereerida ning hiljem just nimelt Weather klassis samu andmeid kasutada.

Reaalselt oma taset arvestades ei tohiks siin erilisi "advanced meetodeid", mida teavad inimesed, kes selle ala peal töötavad, olla.
Kommentaarid: 23 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 23
tagasi üles
vaata kasutaja infot saada privaatsõnum
Ho Ho
HV Guru
Ho Ho

liitunud: 16.02.2002




sõnum 13.03.2012 19:15:30 vasta tsitaadiga

Tee klassid:
weather mis hoiab üht konkreetset ilmainfot (asukoht, timestamp, temperatuur)
weatherAnalysis vmt mis sisaldab listi weather objektidest, funktsiooni weatherite lisamiseks sinna listi ning funktsiooni tolle listi töötlemiseks

Mainis siis tekitad tolle weatheranalysis klassi, laod oma ilmainfo sinna sisse ning kutsud töötlusfunktsiooni välja.

_________________
Teach a man to reason and he'll think for a lifetime
Common sense - so rare that it's a damn superpower
Vaadates paljude inimeste sõnavõtte siin ja mujal jääb üle ainult klassikuid tsiteerida - "I weep for humanity"
Kommentaarid: 106 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 86
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
spreiii
HV kasutaja

liitunud: 27.12.2008




sõnum 13.03.2012 20:34:44 vasta tsitaadiga

Niisiis, võttes arvesse siin teemas tehtud soovitusi ja erinevaid koodipostitusi, sain hakkama millegi sellisega:
c#:
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace Testing
  7. {
  8.     /// <summary>
  9.     /// Linnad
  10.     /// </summary>
  11.     public enum City { Jõhvi, Narva, Tartu, Tallinn }
  12.  
  13.     public class Weather
  14.     {
  15.         // Andmed
  16.         public City Linn { get; set; }
  17.         public DateTime Kuupäev { get; set; }
  18.         public int Kesktemp { get; set; }
  19.         public static List<Weather> Weathers = new List<Weather>();
  20.  
  21.         /// <summary>
  22.         /// Ilma andmete lisamine
  23.         /// </summary>
  24.         /// <param name="linn">Linn</param>
  25.         /// <param name="kuupäev">Kuupäev</param>
  26.         /// <param name="kesktemp">Päeva keskmine temperatuur</param>
  27.         public static void AddWeatherInfo(City linn, DateTime kuupäev, int kesktemp)
  28.         {
  29.             Weather.Weathers.Add(new Weather(linn, kuupäev, kesktemp));
  30.         }
  31.  
  32.         // Konstruktor
  33.         public Weather(City linn, DateTime kuupäev, int kesktemp)
  34.         {
  35.             Linn = linn;
  36.             Kuupäev = kuupäev;
  37.             Kesktemp = kesktemp;
  38.         }
  39.  
  40.         public override string ToString()
  41.         {
  42.             return String.Format("Linn: {0}\nKuupäev: {1}\nTemperatuur: {2}\n", Linn, String.Format("{0:MM'/'dd'/'yyyy}", Kuupäev), Kesktemp);
  43.         }
  44.  
  45.         public static void TananeIlm(string linn)
  46.         {
  47.             if (Enum.IsDefined(typeof(City), linn))
  48.             {
  49.                 foreach (var data in Weathers)
  50.                 {
  51.                     if (data.Linn == (City)Enum.Parse(typeof(City), linn, true) && data.Kuupäev == DateTime.Today)
  52.                         Console.WriteLine(data.ToString());
  53.                 }                   
  54.             }
  55.             else
  56.                 Console.WriteLine("Sellist linna ei eksisteeri!");
  57.         }
  58.     }
  59.  
  60.     class Program
  61.     {
  62.         public static void Main()
  63.         {
  64.             // Suvalise numbri jaoks
  65.             Random random = new Random();
  66.  
  67.             IEnumerable<City> linnad = Enum.GetValues(typeof(City)).Cast<City>();
  68.             DateTime algus = new DateTime(2012,1,1);
  69.             DateTime lõpp = new DateTime(2012,4,1).AddDays(-1);
  70.  
  71.             foreach(var city in linnad)
  72.             {
  73.                 for (DateTime date = algus; date <= lõpp; date = date.AddDays(1))
  74.                     Weather.AddWeatherInfo(city, date, random.Next(-16, 3));
  75.  
  76.                 Console.WriteLine("OK: Andmed genereeritud linna {0} jaoks!", city);
  77.             }
  78.  
  79.             // Test - näita tänane keskmine temperatuur
  80.             Weather.TananeIlm("Jõhvi");
  81.  
  82.             Console.ReadKey();
  83.         }
  84.     }
  85. }

Sellisel viisil töötab ta nii nagu ideekohaselt vaja oli. Oskab nüüd keegi täiesti huvi pärast kommenteerida kui halva praktikaga siinkohal tegu on? icon_biggrin.gif
Kommentaarid: 23 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 23
tagasi üles
vaata kasutaja infot saada privaatsõnum
Ho Ho
HV Guru
Ho Ho

liitunud: 16.02.2002




sõnum 13.03.2012 21:36:32 vasta tsitaadiga

Kõik staatilised meetodid ja muutjad seal weather klassis absoluuselt ei istu. Kõik peaks olema non-staticutena eraldi klassis. Praegune kood visataks üsna kiirelt igast reaalsest projektist välja.
_________________
Teach a man to reason and he'll think for a lifetime
Common sense - so rare that it's a damn superpower
Vaadates paljude inimeste sõnavõtte siin ja mujal jääb üle ainult klassikuid tsiteerida - "I weep for humanity"
Kommentaarid: 106 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 86
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
neros
HV Guru
neros

liitunud: 26.11.2003




sõnum 14.03.2012 06:57:13 vasta tsitaadiga

Oot oot ... miks me läksime ilusast koodist kuhugi spagetti kus kõik segi on?

Okei, sul on Weather klass kus on Linn, Kuupäev ja Kesktemp. Aga miks sul samas klassis lisaks ka mingi List on? Pigem peaks asi välja nägema selline:


Weather klass kus on linn, kuupäev ja temp. ToString override võib ka sinna vabalt jääda.

WeatherCollection kus on kollektsioon weatheritest ning manipulatsioonifunktsioonid. Seal peaks siis olema "TänaneIlm".

Ja kui norima hakata siis peaks WeatherCollection olema AINULT kollektsioon Weather objektidest mis oleks enamvähem nagu "repository". Heaks tavaks on hoida igasugused repositoryd ja repositoryloogika eraldi, näiteks Extension meetoditena.

Extension method võiks välja näha selline:

public static class WeatherExtensions {
    public static IEnumerable<Weather> CityIs(this IEnumerable<Weather> collection, string city) {
        List<Weather> result = new List<Weather>();
        foreach(var item in collection) {
            if(item.Linn == (City)Enum.Parse(typeof(City), city, true))
                result.Add(item);
        }
        return result;
    }
}


(Soovitan soojalt tutvuda artikliga http://msdn.microsoft.com/en-us/library/bb383977.aspx muuseas)

Sama teed ka kuupäevaga. Siis saad teha nii:

foreach(var item in weathercollection.Weathers.CityIs("Tartu").DateIs(DateTime.Now)) {
    Console.WriteLine(item.ToString());
}


ps: ei anna pead et 100% töötab :p poole tunni pärast jõuan tööle siis saan kontrollida, seal on mingi test olemas.

_________________
GitHub
.NET Core & Azure baasil lahendused ja arhitektuur - kontakt.
Kommentaarid: 48 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 40
tagasi üles
vaata kasutaja infot saada privaatsõnum
neros
HV Guru
neros

liitunud: 26.11.2003




sõnum 14.03.2012 08:47:30 vasta tsitaadiga

Nagu lubatud: http://pastebin.com/8aMqAJPX

Selline asi töötab laitmatult. Viskasin sinna extension meetodid nii LINQi põhjal kui ka foreachi ja yield returni põhjal. Yield return siis tagastab vasted kui järgmist elementi küsitakse, mitte kogu kollektsiooni korraga. Kui tarvis ainult teatud vaste leida (nt esimene), on natuke ressursisäästlikum.

Extension meetodid on staatilised, niiet et mitte eksitada, tekitasin WeatherManipulator klassi. Selle Run meetod käivitatakse mainist. Ehk oli kasu icon_smile.gif

_________________
GitHub
.NET Core & Azure baasil lahendused ja arhitektuur - kontakt.
Kommentaarid: 48 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 40
tagasi üles
vaata kasutaja infot saada privaatsõnum
spreiii
HV kasutaja

liitunud: 27.12.2008




sõnum 14.03.2012 10:33:06 vasta tsitaadiga

Ei vaidle üldse vastu, et selline kood tunduvalt ilusam on, tõesti on. Probleemiks siinkohal oligi just see, et andmetega töötamine (erinevad meetodid) tuli õppejõu sõnul luua just nimelt Weather klassis. Ei Main-is, ei Weatherx klassis, vaid just Weather klassis - ja seda miks? Ma tõsiselt ei kujuta ette. icon_rolleyes.gif
Kindluse mõttes küsisin ma vähemalt 2 korda üle, et kas just Weather klassis, mitte kuskil mujal.
Loengud ka muidugi eriti kiita pole..
tsitaat:
Ehk oli kasu

Kasu oli ilmselgelt - ei jää vähemalt arusaama, et kõik peabki üks suur *spagett* välja nägema icon_biggrin.gif
Suur tänu igal juhul, et viitsisid vaeva näha sellise asjaga icon_smile.gif


viimati muutis spreiii 14.03.2012 10:44:05, muudetud 2 korda
Kommentaarid: 23 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 23
tagasi üles
vaata kasutaja infot saada privaatsõnum
Ho Ho
HV Guru
Ho Ho

liitunud: 16.02.2002




sõnum 14.03.2012 10:36:42 vasta tsitaadiga

Tbh saadaks ma tolle õppejõu seenele kui ta normaalselt vastavalt sisule klassidesse jagatud koodi ei taha saada. Kui ta vastu virisema hakkab otsi mõni praktika läbiviija või teine progemise õppejõud ning lase tal asi üle vaadata. Igal juhul ei tasu niisama jätta seda, kui äärmiselt valesid töövõtteid õpetatakse.
_________________
Teach a man to reason and he'll think for a lifetime
Common sense - so rare that it's a damn superpower
Vaadates paljude inimeste sõnavõtte siin ja mujal jääb üle ainult klassikuid tsiteerida - "I weep for humanity"
Kommentaarid: 106 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 86
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
neros
HV Guru
neros

liitunud: 26.11.2003




sõnum 14.03.2012 12:10:14 vasta tsitaadiga

Nõustun eelkõneleja seisukohaga. Ma räägiks lisaks veel kellegagi, kes istub natuke kõrgemal positsioonil kui nimet õppejõud, vähemalt siis kui kõik mida sa siiani maininud oled 100% tõsi on. Ma ei kujuta ette ka miks keegi selliseid idiootsusi õpetama peaks... Ja kui loengud ka kiita pole, miks sa istud seal ja kuulad lollusi icon_lol.gif
_________________
GitHub
.NET Core & Azure baasil lahendused ja arhitektuur - kontakt.
Kommentaarid: 48 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 40
tagasi üles
vaata kasutaja infot saada privaatsõnum
spreiii
HV kasutaja

liitunud: 27.12.2008




sõnum 14.03.2012 13:34:56 vasta tsitaadiga

madedog kirjutas:
Nõustun eelkõneleja seisukohaga. Ma räägiks lisaks veel kellegagi, kes istub natuke kõrgemal positsioonil kui nimet õppejõud, vähemalt siis kui kõik mida sa siiani maininud oled 100% tõsi on. Ma ei kujuta ette ka miks keegi selliseid idiootsusi õpetama peaks... Ja kui loengud ka kiita pole, miks sa istud seal ja kuulad lollusi icon_lol.gif

Noh.. eelkõige istun ma seal sellepärast, et minu grupis on alles jäänud 2 inimest(k.a. mina) 14-st icon_lol.gif
Umbes pooled langesid esimesel poolaastal välja ja ülejäänud pooled kas vahetasid eriala või läksid sisekaitse akadeemiasse icon_biggrin.gif

Nali-naljaks, aga kokkuvõttes on vaja selles aines ka projekt teha, mida tuleb hiljem kaitsta. Programmeerimine mulle meeldib ja ma võtan asjad üsna kiiresti omaks, aga selline praktika ei tee kohe kindlasti head.
Kas ma peaks hindamisele saatma versiooni, mis ma ise kokku klopsisin (see, mida reaalses elus iialgi kasutusele ei võetaks icon_biggrin.gif), või kasutaja madedog nn. "õige" versiooni ja siis vaatama mis mulle öeldakse?
Kommentaarid: 23 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 23
tagasi üles
vaata kasutaja infot saada privaatsõnum
Ho Ho
HV Guru
Ho Ho

liitunud: 16.02.2002




sõnum 14.03.2012 13:44:06 vasta tsitaadiga

Peaksid ise kirjutama miskit analoogset madedog'i variandile, otse copy-paste kohe kindlasti ei sobiks.
Kui õppejõule ei sobi too variant siis hakkad kõrgema võimu kaudu uurima mis värk on.

Hetkel ei saa välistada ka sellist varianti, et õppejõud lihtsalt eeldas et rahvas liiga loll et asjaliku lahendusega välja tulla ning laskiski neil mingi ülitriviaalse asjaga välja tulla. Oleks ta hakanud rääkima korrektsest klassihierarhiast ning ülesannetele vastavalt objektide tekitamisest oleks see ülesandest aru saamise mõne jaoks veelgi keerukamaks teinud. Ehk siis ma väga ei imestaks kui ta ka korrektse lahenduse vastu võtab ning ehk mõne kiidusõnagi ütleb.

_________________
Teach a man to reason and he'll think for a lifetime
Common sense - so rare that it's a damn superpower
Vaadates paljude inimeste sõnavõtte siin ja mujal jääb üle ainult klassikuid tsiteerida - "I weep for humanity"
Kommentaarid: 106 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 86
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
neros
HV Guru
neros

liitunud: 26.11.2003




sõnum 14.03.2012 13:46:53 vasta tsitaadiga

Aha... ma saan aru et see sama asi mis sa siia postitasid on su bakatöö? "Õige" versioon on tegelikult selleks et sulle natuke loogilisem ja laiemalt kasutatav tee kätte juhatada pigem, mitte selleks, et copy-paste teha. Aga eks sa tee mida heaks arvad icon_smile.gif Mingit copyrighti kusagile pandud ei ole ja kui sulle sellest jama ei teki, lase käia.

E: Ka see mis Ho Ho ütles, on võimalik. Tahtis teada, kas lähed ise otsima (või plagiatsiooni tegema icon_razz1.gif) või lasedki ringi nagu lammas ise mõtlemata

_________________
GitHub
.NET Core & Azure baasil lahendused ja arhitektuur - kontakt.
Kommentaarid: 48 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 40
tagasi üles
vaata kasutaja infot saada privaatsõnum
spreiii
HV kasutaja

liitunud: 27.12.2008




sõnum 14.03.2012 13:53:21 vasta tsitaadiga

madedog kirjutas:
Aha... ma saan aru et see sama asi mis sa siia postitasid on su bakatöö? "Õige" versioon on tegelikult selleks et sulle natuke loogilisem ja laiemalt kasutatav tee kätte juhatada pigem, mitte selleks, et copy-paste teha. Aga eks sa tee mida heaks arvad icon_smile.gif Mingit copyrighti kusagile pandud ei ole ja kui sulle sellest jama ei teki, lase käia.

Ei tegu ei ole lõputööga vaid ühe pisikese praktilise ülesandega. icon_smile.gif
Copy-paste ma ei saaks ka teha kui väga tahaksin - ülesande funktsioone ma meelega ei kirjutanud siia, kuna üritasin keskenduda ühele konkreetsele probleemile, mitte ülesande lahendamisele. icon_smile.gif

E: Tegelikult huvitaks ka selline küsimus, et kas kuskil Internetis leidub head eesti keelset materjali C# jaoks? Hetkel olen huvi pärast vaatanud lynda.com'i videoloenguid C# kohta.
Kommentaarid: 23 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 23
tagasi üles
vaata kasutaja infot saada privaatsõnum
Desmond5
HV kasutaja

liitunud: 14.09.2002




sõnum 19.03.2012 12:01:51 vasta tsitaadiga

Eestikeelseid materjale veebis eriti ei ole. TTÜs ja ITKs on päris palju aineid C# keeles aga materjale veebis väga kohanud ei ole..

Ühtteist leiab siit, aga see käib rohkem veebinduse kohta .NET maailmas (aga annab ka keelest mingi ülevaate):

http://www.eneta.ee/oppimine/veebistuudium/Lehed/veebiarendus.aspx
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  C# classi küsimus mine lehele 1, 2  järgmine
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.