
C# - Problemi i rješenja


Dobra ideja!
Hvala.

Opet ja i linq
Imam dvije liste, lista_a se sastoji se nekakvog id-a i imena
1, Petar
2, Marko
4, Stjepan
5, Ivan
6, Hrvoje
lista_b je slična, isto postoji id i ime, naziv ili kako god
1, Coca-Cola
1, Voda
2, Heineken
6, Corona
7, Staročeško
Rezultat bi trebao ovako izgledati
1, Petar 1, Coca-Cola
1, Petar 1, Voda
2, Marko 2, Heineken
4, Stjepan
5, Ivan
6, Hrvoje 6, Corona
7, Staročeško
Edit:
Liste su sortirane po id-jevima, dalo bi se ručno riješiti:
uzmi prvi id, provjeri da li ima takav u drugoj listi, ako ima upiši id, podatak iz a, opet id, podatak iz b
provjeri da li slijedeći red iz liste b ima isti id ili je drugačiji.........

Ovako nešto možda
public class GrupiranjeClass { class Osoba { public string Ime { get; set; } } class Pivo { public string NazivPiva { get; set; } public Osoba Osoba { get; set; } } public void Grupiraj() { Osoba ivo = new Osoba { Ime = "Ivo" }; Osoba pero = new Osoba { Ime = "pero" }; Osoba marko = new Osoba { Ime = "marko" }; Pivo zuja = new Pivo { NazivPiva = "žuja", Osoba = ivo }; Pivo karlovacko = new Pivo { NazivPiva = "karlovacko", Osoba = ivo }; Pivo karlovacko1 = new Pivo { NazivPiva = "karlovacko", Osoba = pero }; Pivo lasko = new Pivo { NazivPiva = "laško", Osoba = marko }; List<Osoba> osoba = new List<Osoba> { ivo, pero, marko }; List<Pivo> pivo = new List<Pivo> { zuja, karlovacko, karlovacko1, lasko }; var query = from o in osoba join p in pivo on o equals p.Osoba into gj select new { Ime = o.Ime, Pivo = gj }; foreach (var q in query) { Console.WriteLine($"{q.Ime}:"); foreach (Pivo p in q.Pivo) { Console.WriteLine($" {p.NazivPiva}"); } } } }
Guglaj malo više grouped joins.
Sry što ne radi ovo formatiranje kôda, kopiraj ga negdje u editor pa će biti bolje. Zašto je to tako, ne bi znao.

Najljepša/najljepši ti dala/dao
Prilagodio sam, radi kao urica!!
Tvojih tri linije koda naspram mojih 5-6 puta više i koje rade na pola...

Greška

Imam problema sa Task-ovima. Napisao sam mali programcic u kojem neznam tocno sto se dogodilo.
public class Program
{
public static void Main(string[] args)
{
Console.WriteLine("Start");
Action printAction = async () => await PrintLine().ConfigureAwait(false);
printAction.Invoke();
Console.WriteLine("End");
}
public static async Task PrintLine()
{
Console.WriteLine("BeforeDelay");
await Task.Delay(2000);
Console.WriteLine("AfterDelay");
return;
}
}
Start
BeforeDelay
End

Ok, mislim da sam skuzio.
Action je metoda koja (prima argument ili void) i nema povratni tip (ja sam to zamislio kao cisti void) sto bi znacilo da se prilikom poiziva printAction.Invoke() krene izvrsavat PrinLine kao void metoda koja nece vratiti Task koji ce se sacekati sa await-om.
Nek me neko ispravit ako sam krivo protumacio

Trebao bih složiti proceduru za prebrojavanje članova:
1
1 2
3 1 2
4 1
5 1 3
broj 1 se nalazi u 1, 2, 3, 4 i 5-om redu
broj 2 se nalazi u 2 i 3-ćem redu
broj 3 se nalazi u 3 i 5-om redu
broj 4 se nalazi u 4-om redu
broj 5 se nalazi u 5-om redu
Nisam na čisto odakle uopće krenuti, imam masu ifova, vrtim listu (array, svejedno) uduplo i sve se kotura koliko-toliko, ali uskoro će uletiti dvoznamenkasti članovi, pa će ulazni podatak izgledati ovako:
11
12 25
37 13 25
44 11
57 13 38
a to se neće nikako vrtiti...
Što trebam guglat?
Ili i ovdje uskače LINQ/RegEx?

Ovako na prvu čitajući, da se smanji broj prolaza, koristio bi se Dictionary<int, List<int>> u kojem bi Key bio element koji se pojavljuje, a Value lista brojeva redova u kojem se pojavljuje (jedan prolaz kroz sve redove)
Zatim bi se u iteraciji redovima prolazilo elementima u tom redu (foreach pa foreach) te za svaki element pitalo:
- - postoji li kao Key u Dictionaryu - ako da, dohvati njegovu listu i dodaj broj retka u nju, ako ne, dodaj zapis u rječnik za Key = element, Value = new List
Kada se prođu svi redovi, dohvati se lista ključeva u rječniku, može se i sortirati, i zatim za svaki ključ dohvati se i lista redova i prikladno ispiše.

Hvalim, za sad sam napravio prvu stvar prolaz po svim poljima (podaci nemaju razmaka, napisao sam ovako da se vidi kako su podaci složeni), znači prođem po svim poljima, sve pretvorim u dvoslovne/dvobrojne (trebao bih možda i slova, ne znam još), stavim u dictionary da dobijem popis svih iskorištenih brojeva(slova). Nakon toga foreach za svaki zapis u dictionary i prelazim po listi koju sam kreirao nn-nn-nn-nn i sa contains provjerimda li ima podatak npr. '11-' iz dictionary, pa slijedeći...
Na testnim podacima cca 200 redova i 20-ak brojeva za sekundu-dvije dobijem ispis parova prema dictionary.
Hm, ono u value lista redova i nije uopće loše, moram malo zgruntat kako iskoristit.

Pozdrav ekipa
Trenutno radim na aplikaciji koju bi trebalo koristiti par klijenata, ta app se veže na već postojeće baze koje ja nisam pravio, te svako klijentsko računalo ima instaliran sql management.
Dakle moj problem je što svako klijentsko računalo ima drukčiji nazivi sql servera tj. instance connection stringa, te se uvijek može desiti da klijent zamjeni računalo (te zbog toga bi mu se u budućnosti promjenio naziv sql servera), zbog toga trebam napraviti da korisnik pri paljenju aplikacije odabere sql server, te nakon toga da mu se izlistaju baze koje on ima, te odabere bazu.
problem 1. kada dohvatim: var instances = SqlDataSourceEnumerator.Instance.GetDataSources(); , app tek dohvati instance nakon 3 minute , dakle presporo
Da li je najbolje riješenje:
string nazivPc = Environment.MachineName
sConn = @"Data Source=nazivPc\SQLEXPRESS";
Te kada se spoji na sql server , da preko storane procedure izlistam sve baze u combobox select * sys.databases
Ili je najbolje riješenje napraviti tablicu sa nazivom klijenta, nazivom sql servera (gdje bi provjeravao nazive sql servera na klijentskim računalima te ubacio u bazu), te nazivom baze
Unaprijed hvala

Moralo bi raditi i bez imena hosta tj samo ime instance (sqlexpress ili neka druga named instanca) ili cak samo "localhost" ako je samo jedna instanca.

Kod sebe na računalu imam dvije instance: localDb\MSSQLLocalDB i mojPc\express
SQLBrowser service pokrenut
Kada dohvaćam preko:DataTable dtSqlServers= SmoApplication.EnumAvailableSqlServers(true); ili SqlDataSourceEnumerator instance = SqlDataSourceEnumerator.Instance;
Doslovno treba minut da dohvati, te samo dohvati express instancu.
Dok preko registrya dohvati odmah instancu, al također samo express, dakle nikad mi ne prikaze localDb .
Na jednom računalu sam koristio 4.7.2 .net , dok sam na drugom koristio 4.5 . net, te je identična situacija bila

LocalDB i SQL Express nije isto, LocalDB nije pokrenut sve dok ga app ne aktivira preko conn stringa, zato ga ne nalazi. SQL Express se uvijek vrti.

Hvala na savjetima
Imam sada jedan zanimljiv matematički problemčić, koji se može uraditi (vjerujem) na dosta načina, ali je bitna efikasnost
Dakle potrebno je inicijalizirati niz brojeva duljine npr 5 i korisnik treba unijeti neku vrijednost npr 50 . I sada me zanima na koji način mogu dodati programibilno random brojeve u niz, a da je zbroj tih brojeva u nizu jednako unesenoj vrijednosti tj ravno 50
Ne bih želio da su svi brojevi u nizu[10,10,10,10,10] , već razne varijante

Neki random s rasponom koji je unesen. Npr random(0,50).
I onda u while petlji proci taj raspon s brojem polja sve dok suma ne bude jednaka tom nekom broju.
Ovo pucam iz glave, nesto tako sam zamislio.

Pozdrav!
Imam jednu nejasnoću koju bi htio razjasniti.
Koristim signalR na asp.net core 3.1 i pravim aplikaciju u kojoj će se igrati nekakvi turniri.
Igrači se mogu registrirati na turnir i isto tako deregistrirati. Za to koristim listu objekata u turnirskom objektu.
Mene zanima da li trebam implementirati nekakav oblik locka na listi prilikom dodavanja illi brisanja objekata igrača.
Dali je to onda syncroot iz ICollection? https://docs.microsoft.com/en-us/dotnet/api/system.collections.icollection.syncroot?view=netcore-3.1

Ako ne planiraš imati mnogo usera koji će istovremeno raditi nešto po bazi, nema potrebe za time.

Ako ne planiraš imati mnogo usera koji će istovremeno raditi nešto po bazi, nema potrebe za time.
Zasto po bazi? Baza bi trebala imati svoj locking out of the box

Na stackoverflowu mi kaže neki lik da treba koristiti ili threadsafe collection ili lock
https://stackoverflow.com/questions/67626037/do-i-need-a-lock-on-a-list-where-i-add-or-remove-object-from-list-on-invocation/67626633#67626633
iz same igre useri ne koriste bazu, barem ne za sad

Zasto po bazi? Baza bi trebala imati svoj locking out of the box
Mislio sam na spremanje podataka u bazu, krivo sam se izrazio.

Zasto po bazi? Baza bi trebala imati svoj locking out of the box
Mislio sam na spremanje podataka u bazu, krivo sam se izrazio.
Ma OK ali svejedno ne razumijem - zasto bi ikakav locking trebao postojati sa klijentske strane radi toga?

Ne znam ni ja. Po meni nepotrebna zajebancija.

Pozdrav!
Imam jednu nejasnoću koju bi htio razjasniti.
Koristim signalR na asp.net core 3.1 i pravim aplikaciju u kojoj će se igrati nekakvi turniri.
Igrači se mogu registrirati na turnir i isto tako deregistrirati. Za to koristim listu objekata u turnirskom objektu.
Mene zanima da li trebam implementirati nekakav oblik locka na listi prilikom dodavanja illi brisanja objekata igrača.
Dali je to onda syncroot iz ICollection? https://docs.microsoft.com/en-us/dotnet/api/system.collections.icollection.syncroot?view=netcore-3.1
Trebaš, jer thredovi paralelno pristupaju podacima te liste.
Ovdje je tutorial sa sličnom arhitekturom (klijenti pristupaju podacima iz singletonea), podaci su u thread-safe ConcurrentDictionaryju.

Pozdrav, pocetnik sam u programiranju i zapeo sam na ovom zadatku pa ako bi me mogao netko uputiti kako rjesiti zadatak i sto napraviti bio bi mu zahvalan. Mozda ako imate neki slican zadatak sa rjesenjem isto bi mi pomoglo. Gledao sam po internetu imali sto slicno ali nisam nasao nista sto bi mi pomoglo rjesiti problem. Skuzio sam da bi vrijednosti mogao ucitati preko streamreadera ali ne znam kako da ucitam samo brojke to jest kako da napravim da mi ucita samo x i y vrijednosti.
Razmatramo zemljopisnu mapu na kojoj je prikazano n gradova. Tekstovna
datoteka gradovi.txt u prvom retku sadrži informaciju o broju gradova te
potom za svaki grad u zasebnom retku sadrži informaciju o njegovom
položaju na mapi, u obliku (x,y) gdje su x i y koordinate točke. Sadržaj
čitave datoteke prikazan je u nastavku.
Pretpostavite da se korisnik prilikom putovanja između dva grada kreće
najkraćim mogućim putem (po pravcu koji spaja te razmatrane gradove).
a) Napišite program koji će učitati podatke iz datoteke gradovi.txt te
odrediti i na zaslon ispisati ukupnu duljinu puta koju će korisnik proći
ako gradove posjećuje točno redoslijedom kojim su zadani u datoteci (i
staje kad posjeti zadnji grad).
b) Pretpostavite sada da korisnik razmatrajući gradove istim redoslijedom
kao u prethodnoj točki može odlučiti da točno jedan grad neće posjetiti.
Doradite program tako da nakon što ispiše podatke tražene pod (a) utvrdi
koji je grad potrebno preskočiti kako bi se maksimalno smanjila duljina
pređenog puta. Program treba ispisati redni broj grada i potom duljinu tog
puta.
Datoteka gradovi.txt
10
(100,30)
(50,210)
(25,330)
(77,250)
(250,500)
(300,700)
(300,900)
(250,800)
(80,400)
(10,20)

Broj gradova imaš, tako da jedini "problem" je na neki način razdijeliti te stringove u kojima su zapisane koordinate. Googlaj "string.split method" pa pokušaj doći do rješenja.

Jel mi more neko pojasnit literale, znaci prolazim sad kroz jednu knjigu i ovo mi uopce nije jasno. Znaci kad ovako napisem, onda je to double zapravo?
float pi = 3.1415926536
a ako ocu float onda moram ovako napisat
float pi = 3.1415926536f
ako sam ja to dobro shvatil i tomu je tako, koja onda poanta pisanja float, decimal, long itd. kod deklariranja varijable? Pa onda mogu napisati i var i stavit literal i netreba mi nista drugo, nije uopce jasna neka "logika" iza toga

Stavlja se f zato jer ne možeš 8bajtnu vrijednost ugurati u 4 bajtnu. Tip podatka na ljevoj i vrijednost na desnoj moraju biti istog tipa.
Zato ne možeš napisati float pi="3.14".
Da možeš staviti var i sve je super, onda je varijabla tipa double, ako staviš var pi=3.14f onda je float.
Ono što ne znaš je da var postoji od verzije C# 3.0 i .NET frameworka 3.5. I mora se održati kompatibilnost s starijim verzijama.
Dali češ koristit implicitno ili explicitno var ili double ovisi o tebi. Nema nikakve razlike, samo kompajleru mora biti jasno što želiš.

Ok, hvala. A kak znam kolko mi byteova ima vrijednost? Kolka je velicina jednog znaka? Znam da je kod chara 1byte al to tesko da moze bit jel je onda onaj gore prevelik i za double. I drugo sta se onda dogada sa vrijednosti kad naguram taj prevelik broj u float sa literalom?
Možda bubam bezveze, ali možeš spojiti podatke iz liste B i C u drugu listu BC i onda raditi JOIN prema uvjetima po kojima su Id-ji iz A jednaki sa Id-jem iz spojene liste BC.