- Azonnali informatikai kérdések órája
- Melyik tápegységet vegyem?
- Milyen TV-t vegyek?
- Apple MacBook
- NVIDIA GeForce RTX 5070 / 5070 Ti (GB205 / 203)
- Gaming notebook topik
- Elképesztően drága az új Ryzen Threadripper PRO generáció
- NVIDIA GeForce RTX 4060 / 4070 S/Ti/TiS (AD104/103)
- Iszonyatos mennyiségű hulladékkal járhat a Windows 10 terméktámogatásának vége
- OLED TV topic
Új hozzászólás Aktív témák
-
-
-
válasz
RedSign #1697 üzenetére
pontosan, egy int nem kaphat üres string értéket, ezen azonnal elhasal a fordító. Egyébként az üres string elegánsabb módja a String.Empty;
De ha már nagyon C# 3.0 (vagy felette) az induló verzió, akkor lehet használni type inference-t is, vagyis egy olyan módszert, amivel nem kell a kód írásakor a típusokkal foglalkoznod. Ez bevett dolog az iskolapadon kívül (bár remélem, legalább ilyen alap dolgokat tanítanak) és már az alapozástól alkalmazható.
Például:
string s = String.Empty;
helyett használható simán
var s = String.Empty;
Persze ez egy nagyon egyszerű példa, de nagyon sok esetben igen hasznos dolog. A típusosság megmarad és majd a fordító kitalálja, hogy milyen típusnak is kell ott állnia.
Vannak azért megkötések is. Csak lokális változóknál használható és például lambda kifejezés esetén sem alkalmazható implicit módon.
-
RedSign
tag
válasz
Neil Watts #1694 üzenetére
Pedig eléggé egyszerű
, ehelyett:
int s = "";
Convert.ToInt32(s);talán így:
String s = "";
Convert.ToInt32(s); -
j0k3r!
őstag
válasz
Neil Watts #1687 üzenetére
hello!
nemtudom eddig miket talaltal, de en ezeket olvasgattam/tom:
reiter fele c# konyv
.NET 3.5 indulokeszlet
linq indulokeszlet(#1694) core2: az ilyen konverziokat erdemes try - catch blokkokban hasznalni + TryParse metodust hasznalni.
-
ArchElf
addikt
válasz
Neil Watts #1694 üzenetére
A C# erosen tipusos nyelv, igy a kozvetlen konverzio nem mukodik. Amennyiben a valtozo tartalma konvertalhato, ugy azt konverter segitsegevel (idegen tipusok, pl. String es int kozott), vagy kozvetlenul int->float/double eseten.
AE
-
válasz
Neil Watts #1693 üzenetére
Na meg egy erdekes dolog, aztan befejeztem mara.
Ha volt egy valtozom string-kent, de azt megvaltoztatom int-re akkor ezt kapom hibakent:Cannot implicitly convert type 'string' to 'int'
Erre kisutottem egy kis Googlezas utan egy ilyet:
int s = "";
Convert.ToInt32(s);Mit cseszhetek el?
Valami nagyon apro dolog (bar lehet, hogy joval nagyobb), gondolom. (amit persze nem veszek eszre).Udv. core2
-
-
válasz
Neil Watts #1690 üzenetére
Igen, az irány már megvan, csupán pár apróság:
string s = "";
Ez esetben nem feltétlenül kell rögtön értéket is adni a változónak, elég, ha csak létrehozod. Majd később adsz neki értéket úgyis.Console.ReadLine("");
Ez nem nagyon szokás. Helyette inkább
Console.ReadKey(); -
válasz
Neil Watts #1690 üzenetére
lol.
ugy nez ki, erre is kezdek rajonni -
most a Pascalos programjaimat probalom atirni, csak meg nem ertem nagyon a valtozokat :/
peldaul ez van Pascalban:
program hello;
var
s:string;
begin
writeln('Mit írjak ki?');
readln(s);
writeln(s);
readln;
end.es ezt alkottam (ehhh... azert ez eros igy ~2,5 ora utan
) C#-ban:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace szervusz
{
class Program
{
static void Main(string[] args)
{
string s = "";
Console.WriteLine("Mit írjak ki?");
Console.ReadLine(s);
Console.WriteLine(s);
Console.ReadLine("");
}
}
}[/M]Most itt string vagy var vagy mi kell? Bar itt a ReadLine-os sorokra panaszkodik :/
Nem kell rogton a megoldas, abbol nem tanul az emberJo iranyba indultam el egyebkent?
Udv. core2
-
válasz
Neil Watts #1688 üzenetére
Épp akartam írni, de látom, Google barátunk már válaszolt.
Kezdj neki, tanulgass, írj mórickákat és ha elakadsz, szívesen segítünk.
-
válasz
Neil Watts #1687 üzenetére
MOD:
Kozben turom a Googlet/MSDN/Technetet, ejj de jokat talalok!
Hat ilyen osszeszedett dokumentaciot/peldafeledatokat nem nagyon talaltam mas nyelveknel -
Sziasztok!
Ugyerzem lassan meg kene tanulnom valamennyire C#-ul, mert igen csak jo fejlesztoeszkozok vannak hozza, es egesz ertheto a megirt kod (ne rohogjetek legyszives: eddig meg egy HelloWorld-ot neztem, az is sokkal erthetobb mint C++-ban.
)
Szoval. Eddig alapszinten Pascaloztam es C++-oztam, de ugyerzem mast is ki kene probalnom. Nem szeretnek most tobbezerert konyvet venni, tehat kernem a topik lakoit, hogy ajanljanak szerencsetlen kezdonek valami hasznalhato dokumentaciot/peldafeladatokat/ebookot/stb.
Koszonom segitsegeteket!
Udv. core2
-
ArchElf
addikt
Van egy csomó fejlesztői portál, ahol "nagyobb" munkákat is bemutatnak.
C-SharpCorner, CodeProject, hogy csak az első kettőt említsem, ami eszembe jut...AE
-
Peetry
senior tag
hi!
C# példákat keresnék a neten, legfőképp kicsit komplexebb rendszerek megvalósításának leírását. Eddig sajnos nem találtam, és nem vagyok meggyőződve, h fogok, de hátha itt valaki már találkozott ilyennel. Szóval nem ilyen legkisebb közös osztó, meg faktoriális példákat, mert foglalkoztam már C#-al, de mélyebben is érdekel. Szóval elsősorban vmi összetettebb winforms-os, adatbázisos mintapéldát keresek. Pl publikált szakdolgozat, önlab, tdk dolgozatok között gondolom, hogy lehetnek ilyenek, csak eddig nem nagyon jártam sikerrel. Ha valaki találkozott már ilyennel, akkor pls . Köszi
-
Spam123
tag
Köszönöm szépen segítséget, nem tudom mire mentem volna nélküle!
Console.WriteLine("Kérem a válaszaidat a magyar ABC betűivel A-F-ig vesszővel elválasztva!");
string s = Console.ReadLine();
int i2 = s.IndexOf(",");
string betű1 = s.Substring(0, 1);
string betű2 = s.Substring(i2 + 1, 1);
string betű3 = s.Substring(i2 + 3, 1);
string betű4 = s.Substring(i2 + 5, 1);
string betű5 = s.Substring(i2 + 7, 1);
List<string> válaszok = new List<string>();
List<string> megoldások = new List<string>();
int joválaszok = 0;
válaszok.Add(betű1);
válaszok.Add(betű2);
válaszok.Add(betű3);
válaszok.Add(betű4);
válaszok.Add(betű5);
megoldások.Add("A");
megoldások.Add("B");
megoldások.Add("B");
megoldások.Add("C");
megoldások.Add("D");
for (int i = 0; i < 5; i++)
{
if (válaszok[i] == megoldások[i])
{
joválaszok++;
}
}
Console.WriteLine("Érdemjegy: " + joválaszok);
Console.ReadKey(); -
Spam123
tag
Hát nem nagyon értem megmondom őszintén. Még sosem használtam ezt az iterálást, foreach-et. Hogy is van ez?
Ezt az egész kéttömbös szerkezetet nem értem. Előbb be kell gépelni a jó válaszokat egy tömbbel?Esetleg tudnál írni egy példát evvel a feladattal?
ha csak 5 kerdes van, akkor gyakorlatilag a jo valaszok szama lesz maga az erdemjegy is
Ez tiszta. -
j0k3r!
őstag
válasz
Spam123 #1678 üzenetére
hello!
ha megvan a 2 tomb (uservalasz, jovalasz), akkor mar csak vegig kell iteralnod rajtuk (for, foreach) es osszehasonlitani az adott elemeket, es minden egyes egyezesnel novelnel egy valtozot (jovalaszokszama), ami alapjan a vegen tudsz majd %-ot, vagy erdemjegyet szamitani.
szerk: ha csak 5 kerdes van, akkor gyakorlatilag a jo valaszok szama lesz maga az erdemjegy is.
-
Spam123
tag
Üdvözletem!
Lenne egy feladat amit nem tudok elkészíteni.
A feladat így szól:Egy tanuló, egy adott tesztre való válaszait egy stringbe, egymástól vesszővel elválasztva olvassunk be. A válaszok ABC betűit, A-F. A jó megoldásokat egy másik tömbben vannak letárolva amit mi adunk meg.
Számoljuk össze 5 kérdésből hányra adott helyes választ és válaszok számának megfelelő jegyet értékeljük.
Nah most még az menne, hogy kiolvasom a stringből egyenként a megoldásokat(split?!), de hogy két tömbbel hogyan kell dolgozni, az nagyon nem. A másik az osztályozás, el sem tudom képzelni hogy kéne. Feltételes utasítás?
Nagyon hálás lennék, ha valaki tudna segíteni benne.
Üdv!
-
SebajTobias
tag
Köszi elolvastam, bár elég elrettentő cikk. Ezek szerint menjek haza, és falazzam magamra az ajtót-ablakot, és kb 1-2 év mulva előjöhetek
Bár a suliról jókat irnak (remélhetően még aktuális). Na majd meglássuk... ha belevág megírom milyen volt
thx -
Brown ügynök
senior tag
válasz
SebajTobias #1675 üzenetére
Hello!
Én is csak olvastam róla mert szerettem volna valami webfejlesztői tanfolyamot végezni. Ebben a cikkben megemlítik.
[link] -
SebajTobias
tag
Sziasztok. Szeretnék foglalkozni C#-al, és arra gondoltam elmegyek egy esti tanfolyamra így meló mellett. Tudtok ajánlani valamit?
[Erről] valaki valamit?
Sajnos elég sok rosszat hallottam a tanfolyamokról (lehúzás, alig tanítanak valamit), nem akarok kidobni az ablakon a pénzem.
Előre is köszi -
válasz
ArchElf #1657 üzenetére
Logoláshoz: Microsoft Enterprise Library . egy sor hasznos funkciója van a logoláson kívül.
"Jaja, és amúgy igazi alkalmazásnál StoredProcedure rulez"
Vagy ha még igazibb, akkor NHibernate és Linq például és nem is érdekli tovább a programozót az adatbázis.
adam_:
Én is, hasonlóan ArchElf kollégához egyszerű gombokkal vagy PictureBox-okkal oldanám meg. 2 perc gondolkodás után talán egy osztállyal kezdeném, ami a hajó objektumot zárja magában olyan tulajdonságokkal, mint hossz, elhelyezkedés (koordináták) és talán Decorator Patternnel vagy simán extension method-dal oldanám meg a találatot. Annak ellenére, hogy maga a torpedó egyszerű játék, azért nem 2 sor kód. -
ArchElf
addikt
Szerintem te kevered a torpedót az aknakeresővel...
Az aknakeresőben kell kiírni, ha van mellette akna, a torpedóban azt kell kijelezni, ha eltaláltál valamit: Mondjuk van egy 10x10-es táblád, ami alapból kék (10x10 gomb, legegyszerűbben), és ha jóra kattintasz (ami mögött van hajó), akkor bepirosodik (eltaláltad), ha pedig nem, akkor beszürkül...AE
-
ArchElf
addikt
Webalkalmazás (alkalmazász szintű) logolásához kellene...
Ránézek erre a trace-es dologra.Úgy tűnik, ez nem annyira bejövős...
You must enable tracing or debugging to use a trace listener. The following syntax is compiler specific. If you use compilers other than C# or Visual Basic, refer to the documentation for your compiler.
To enable debugging in C#, add the /d:DEBUG flag to the compiler command line when you compile your code, or you can add #define DEBUG to the top of your file. In Visual Basic, add the /d:DEBUG=True flag to the compiler command line.
To enable tracing in C#, add the /d:TRACE flag to the compiler command line when you compile your code, or add #define TRACE to the top of your file. In Visual Basic, add the /d:TRACE=True flag to the compiler command line.AE
-
adam_
senior tag
válasz
ArchElf #1664 üzenetére
A probléma megoldását, meg úgy képzeltem el, hogy ugye van ez az eddig kész kockák amik kattintásra reagálnak, egyenlőre csak nullákat tartalmaz. Azt szeretném elérni, hogy az egyes (véletlenszerűen) kikevert kockák közül valamelyikbe ilyen logóféleségek lennének hajóképpen, amiket ha eltalálok eltünik.
A másik gondom az az, hogy torpedószerűen, azt hogyan tudom megadni, mint a tipikus torpedós játékokba, hogy akörül számok vannak ahol van torpedó, és ahol meg nincs ott nullákat adjon ki cellaértéknek, ha rákattintok egy kockára.
Én valahogy így "lebutítva" képzeltem el, de sztem ez is jó lehet. Ötletek, tippek?
Bár lehet a második rész felesleges is, cska egyenlőre jeleket kreáljon, amiket véletlenszerűen keverjen meg, és nyomásra megjelenjennek (a hajók)
-
x007
tag
válasz
ArchElf #1657 üzenetére
Én a beépített megoldást szoktam használni. Elég egyszerű: vannak üzenet források (TraceSource), amikbe küldöd az üzeneteket. Ezeket a prioritásuk (TraceLevel) szerint tudod szétosztani (Switch, EvenTypeFilter) a loggoló komponensekhez (TraceListener).
Gondolom ez kellene Neked, de bevallom én még nem próbáltam
.
-
ArchElf
addikt
Anélkül, hogy megnézném, mit csináltál eddig az alábbiakat jó volna tudni:
Fejlesztői környezet (bár tudom, hogy a projektből is rá tudnék jönni - meg is néztem VS2010, amit még lusta voltam itthon felrakni...)
Megcélzott Framework (.Net 2.0, 3.5, 4.0?)
Hogy képzeled el a probléma megoldását (szavakban/képekben).Szóval "csak úgy" nagyon nehéz nekiállni bármit is csinálni. Ha nincs egy terv a fejedben (vagy papíron), akkor nagy valószínűséggel csak egy kusza romhalmaz lesz a vége. Szóval szeretném(-nénk) tudni, hogy mit gondolsz a problémáról és hogy hogyan kezdenél hozzá (elméletben) a leküzdéséhez. Ha ez megvan, már könnyen tudunk segíteni a programozási nehézségek megoldásában.
AE
-
adam_
senior tag
válasz
Lortech #1662 üzenetére
Rendben van, feltöltöttem zippelve a projektemet, eddig ennyit sikerült kihozni a torpedós játék elképzelésemből, és most fogalmam sincs, hogyan tovább, vagy hogy egyáltalán jó-e ez a metódus amit elkezdtem. Tehát íme:[link]
Köszönöm előre is az eszmecserét! Remélem hasznos lesz számomra!
Még annyit hozzáfűznék, hogy nagyon "zöldfülű" vagyok C# programozásban, így hát kérlek, úgy is magyarázzátok el, hogy mit kéne tennem, hogy ebből kialakuljon egy torpedós játék. -
Lortech
addikt
Hali, ide válaszolnék: szerintem érdemes lenne megosztanod az eddigi megoldásod a fórumlakókkal, és hogy hol akadtál el, így bárki hozzá tudna szólni, aki ért hozzá és épp van ideje, a kezdők pedig láthatják a kialakult eszmecserét és tanulhatnának belőle, ami végülis a célja volna a fórumnak.
-
adam_
senior tag
Készíts torpedó játékot! A gép rejtsen el néhány véletlenszerűen elhelyezett hajót, majd számolja a játékos lövéseit / találatait!
Ezt a feladatot kaptam, ezt kell megírnom C#-ban, már el is kezdtem, de elakadtam egy fázinál, valaki hozzértő tudna segíteni, szívesen elküldöm neki az eddigi projektem is, hogy hogy áll.
Nagyon fontos lenne. Köszönöm szépen előre is!
-
Lortech
addikt
válasz
ArchElf #1657 üzenetére
Szoktam használni, nagyobb projekteknél is bevált, nagyon jól konfigolható, bővíthető, erős eszköz. Ha használtál log4j-t, akkor nem okozhat problémát. Ha nem, rá kell szánni némi időt a megismeréséhez, de alapabb feladatokat hamar meg lehet vele csinálni.
Log4net Inicializálás pl.:
log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo(Settings.Default.Log4NetConfigFile));Ahol a Settings.Default.Log4NetConfigFile a config fájl neve.
Logger inicializálása / típus:
private static ILog Log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);Fájlból szoktam konfigurálni, erre van kismillió leírás neten, nálam ez az alap (lentebb), az appenderekre és loggerekre példák itt: [link]
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<log4net>
<appender...>
...appender definíciók...
</appender>
<root>
...
</root>
<logger...>
...logger definíciók...
</logger>
</log4net>
</configuration> -
ArchElf
addikt
Van valakinek tapasztalata log framework használatában (pl. log4net).
IIS-hez fájlba logoláshoz mintakódot (és konfig fájlt) szívesen látnék.AE
-
ArchElf
addikt
Amúgy célszerű, ha nem a "MySqlCommand username_keres = new MySqlCommand();"-ot hasznlod, hanem az alábbit (hibakezelés nélkül):
MySqlConnection con = new MySqlConnection();
con.Open();
MySqlCommand username_keres = con.CreateCommand();De még jobb a using-ot használni:
MySqlConnection con = new MySqlConnection();
con.Open();
//...
bool user_letezik;
using(MySqlCommand username_keres = con.CreateCommand())
{
user_keres.CommandText = "SELECT id FROM account WHERE username=?UN";
user_keres.Parameters.Add(new MySqlParameter("UN", user);
user_keres.Prepare();
object ret = user_keres.ExecuteScalar();
if (ret is DbNull)
user_letezik = False;
else
user_letezik = True;
}A connect-et elég egyszer inicializálni a futtatás során, és bármikor lehet vele command-ot "gyártani".
AE
-
M.Úr
tag
Sejtem hogy miért hozol létre a _keres() metódusokon kívül is egy connectiont, de ez így nem fog működni. Ha a _keres()-en belül létrehozol egy új kapcsolatot, szerintem azt
ismeg kell nyitnod, mielőtt kérést küldenél hozzá.
Kipróbáltad amit írtam (open a _keres-en belül)? -
Shyro
csendes tag
Szia!
Próbáltam végiglépegetni a programom, de egészen a hibáig ( "Connection must be valid and open" ), semmi előjele nincs a dolognak.
Egyszerüen itt meghal:
MySqlDataReader reader = username_keres.ExecuteReader();Igen, jól látod, hogy a fő programrészben megnyitom a connection_open_realmd metódussal a connection_realmd kapcsolatot.
És után használni akarom a keres osztály függvényeit, amelyeknek kellene megmondani, hogy melyik nyitott kapcsolatot használják ugye. Ez volt előzőleg a hibám. Ugyanis, akkor nem rendeltem hozzájuk.connection connect = new connection();
MySqlCommand username_keres = new MySqlCommand();
username_keres.Connection = connect.connection_realmd;Noss, én itt meg is akarom mondani neki, viszont vagy nem értheti így, vagy valami más lehet a hiba oka.
-
M.Úr
tag
Hali!
Én először debugolni próbálnám. Ha Visual Studio-t használsz, akkor ez nem jelenthet gondot. Tegyél breakpointokat a kérések köré, és figyeld a connection-höz kapcsolódó változókat.
szerk.:
Úgy látom létrehozol egy connectiont a button click else ágában, majd azt megnyitod. Eztán futtatod a kérést, ami létrehoz egy új connectiont, amit sehol nem nyitsz meg, majd ide próbálsz lekérdezést küldeni.A connect.connection_open_realmd(); parancsot a *_keres() metódusokba biggyeszd be a megfelelő helyre.
-
Shyro
csendes tag
Sziasztok!
Megint csak ugyanezzel a problémával fordulnék hozzátok, sajnos ez a hiba újra meg újra megtalál. A helyzet annyiban változott, hogy most elvileg megmondtam a command-nak, hogy milyen kapcsolatot használjon, mégse szándékozik futni. A hibaüzenet ugyanaz.
LINKElőzőleg megcsináltam egy lebutított variációját konzolban, ami szépen is futott. Így bátorkodtam nekiállni a "végleges" verziónak, de hiába egyszerüen nincs ötletem mi lehet megint a hiba.
Biztosan nem valami bonyolult, csak én nem látom, ha valaki tud segíteni annak előre is köszönöm! :/ -
bpx
őstag
Szia!
2 dolog:
1. Hiába van connection-öd és nyitod meg, ha a commandokat nem kapcsolod össze vele. A commandnak sehol sem adtad meg, hogy milyen kapcsolatot használjon, így persze hogy panaszkodik.
2. SQL paramétert tényleg paraméterrel kellene megadni, nem pedig magát az SQL-t "összeollózni" (sql injection, dbms optimizer).
például így:
MySqlCommand user_keres = new MySqlCommand();
user_keres.CommandText = "SELECT id FROM account WHERE username=?UN";
user_keres.Connection = connection;
user_keres.Parameters.Add(new MySqlParameter("UN", user);
MySqlDataReader reader = user_keres.ExecuteReader();ha minden igaz, akkor MySQLhez ? kell az SQL Servernél megszokott @ helyett a paraméterhez
-
Shyro
csendes tag
Sziasztok!
Itt a programom, ami annyit csinál, hogy bekéri a felhasználónevet, jelszót, és az email címet, majd ezeket az adatokat egy új rekordban elmenti az adatbázis megfelelő táblájába.
Ahhoz, hogy meglévő felhasználónevet és emailt ne lehessen megadni a username/email_beker függvényt használom, ami ha talál false értékkel, és ha nem talál létező felhasználót/emailt true-val tér vissza.
A problémám itt jelentkezik, ugyanis a:
MySqlDataReader reader = user_keres.ExecuteReader(); -nél ezt a hibaüzenetet kapom:
"Connection must be valid and open.Az igazság az, hogy előtte a programrészben már megnyitom a "connection"-t, itt:
if (!connect_check)
Connection_Open(); - metódussal.Megpróbáltam kiolvasni try...catchel, hogy mit küld vissza a MySQL, de egyszerüen meghalt a program. Nincs ötletem a dologra, hogy mi lehet a probléma.
Ha valakinek van, annak nagyon megköszönném ha megosztaná velem! -
ArchElf
addikt
Mondjuk itt pont nem törölsz, hanem kiválasztod a nem törlendőket...
Amúgy én utoljára többszálú hálózati szkennelő cuccot csináltam és egy listában voltak a background thread-ek. Abból kellett szinkronizálva törölgetni a megállt threadeket, hogy újakat lehessen a listába beemelni. Mondjuk az még VS.NET 2K5-ben készült XP alá (.NET 2.0) és nem voltak benne ilyen LINQ-es szépségek.
Utólag látom, hogy hülyén csináltam, mert még csak szinkronizálni sem kellett volna...AE
-
Lortech
addikt
Singleton vagy nem singleton, annak ebben a kontextusban sok szerepe nincsen. Ha ugyanazt a listát - legyen az singleton vagy tetszőleges példánya az osztálynak - kell elérnie és műveleteket végeznie rajta több szálnak, meg kell oldani a szinkronizációt pl. egyszerű lockolással, ahogy írta, de ez is változó, hogy mikor milyen megoldásra van szükség.
-
válasz
ArchElf #1642 üzenetére
Túlbonyolítod.
Nyilván nem úgy értettem, hogy futás közben kirántjuk magunk elól a szőnyeget, de lehet ezt egyszerűbben is.
Ha tudod, melyik elemek törölhetőek (nyilván eldől valahogy), akkor:
var list = new List<string> {"Elso", "Masodik", "Harmadik", "Negyedik"};
var templist = list.Where(element => element.Contains("dik")).ToList();
list = templist;Ha több szál van, akkor meg nem itt kell megfogni, hanem singletont kell használni, de ez nyilván feladattól függ.
-
ArchElf
addikt
válasz
ArchElf #1640 üzenetére
De összedobtam egy egyszerűt delegate-tel is
Ez a nem prímeket veszi ki egy int listából. Nem nagy szám, de a lényeg asszem látható...
class Primszam
{
static void Main(string[] args)
{
List<int> prim = new List<int>();
for (int ix = 1; ix <= 100; ix++)
prim.Add(ix);
prim.RemoveAll(ix => nemprim(ix));
prim.ForEach(ix => Console.WriteLine(ix));
}
private static bool nemprim(int ix)
{
int ih = Convert.ToInt32(Math.Sqrt(ix));
for (int ir = 2; ir <= ih; ir++)
if (ix % ir == 0)
return true;
return false;
}
}AE
-
ArchElf
addikt
Nem egyszerűen kitörlöm az első listából, hanem, mivel a lista elemei nem törölhetők közvetlenül a foreach ciklusban, így az elemeket egyesével végignézem, hogy törlendők-e, ha igen hozzáadom egy másik listához (törlendő elemek listája). Ekkor az első listából nem tudok még törölni (mert invalid lesz az iterátor).
A második ciklusban a törlendő elemek listáján lépkedek végig. Ekkor minden elemre kiadom az elsőlista.Remove(ojjektum) parancsot (ahol az ojjektum a törlendő elemek listájának aktuális eleme). Mivel most a második lista iterátorát használom, így nyugodtan eleht az első listából törölni. A második lista végigjátszása után nyugodtan lehet magát a második listát is törölni (mivel már nincs rá szükség).
Még egy apróság: amennyiben több szálon párhuzamosan is elérjük a listát a futás alatt (szükséges lehet bizonyos esetekben), úgy azt az egész cécó alatt lockolni kell.Remélem érthető volt.
Még egy. Ha a listaelemeket nem lehet rendesen egymáshoz hasonlítani akkor lehet index alapján is törölni, ez viszont macerásabb.
Ebben az esetben egy fordított for ciklussal célszerű megcsinálni, mert így az indexek nem keverednek össze:
for(ix = lista.Length-1; ix >= 0; ix--)
{
if(törlendő(lista[ix]))
lista.RemoveAt(ix);
}De láttam ilyet is a neten:
foreach(object o in new List<object>(lista))
{
if (törlendő(o))
lista.Remove(o);
}AE
-
bpx
őstag
azt a listát nem lehet ciklus közepén módosítani, amin épp iterálsz, mert egy exception a jutalom
egyébként én is ezt a változatot használom (ArchElf) a program többi részén (pl. a sakk logika ellenőrzésnél), csak a kérdéses helyen félbehagytam a dolgot, és ott úgy maradt -
válasz
ArchElf #1637 üzenetére
Ezt nem értem. Átpakolod egyik listából a másikba azokat, amelyek törölhetőek, majd az elsőből kitörlöd és a másodikat nemes egyszerűséggel null-lal teszed egyenlővé... vagyis végső soron elég lenne az első lista törölhető elemeit törölni és kész, nem? 1 sor, így viszont x.
Vagy valami más van a háttérben?
-
ArchElf
addikt
Én általában összegyűjtöm egy listába a törlendő elemeket, és azon végigzongorázva törlöm az elsőből. Pszeudokód:
// Lista -> amiből törölni akarunk
List<object> delO = new List<object>();
foreach (object o in Lista)
{
if (Torolhető(o))
delO.Add(o);
}
foreach (object o in delO)
{
Lista.Remove(o);
}
delO = null;AE
-
bpx
őstag
válasz
Gregorius #1635 üzenetére
az már a csütörtök délelőtti gányolásom eredménye, azóta nem foglalkoztam vele
akkor írtam át, hogy ClientInfo helyett csak a callback channel referenciát tárolja, meg az ellenőrzést is máshogy csinálja (a játékos nevét eleve nem használta semmire, a dátum meg pont az új ellenőrzés miatt nem kell)
az ellenőrző thread csak ott maradt egyelőre, de el se indítom, szóval simán lehet, hogy helytelen, de az nem futigen a foreach-es dolog is előjött, elején ott is van alatta kommentben, hogy hogyan lenne érdemes
a tanácsokat köszönöm
az a baj, hogy közel a határidő, és van egy csomó más dolog, amivel foglalkozni kellene
úgy vagyok már vele, hogy bemutatom ezt a részt kihagyva, úgy legalább működik a játék többi funkciója + nem hal szét random módon a kapcsolat, aztán le van tudva a tárgy legalább...
szerettem volna több dolgot is megvalósítani, de szvsz ez a Silverlight-WCF kombó elég nagy melléfogás lett, sokkal egyszerűbb lett volna vmi (n+1). webes portált csinálni, mint a többiek nagy része, amit összekattintgat az ember 1 nap alatt
szóvalt ezt normálisan legfeljebb önszorgalomból fogom valamikor, ha már felvet a sok szabadidő -
Gregorius
őstag
Itt valami többrendbeli probléma van, ugyanis nem a ClientInfo-t tárolod el a listába, hanem a callback channelt. Aztán kicsit odébb az ellenőrző loopban foreach (ClientInfo c in clients) ami gyönyörűen elszáll, ugyanis a listában lévő IChessClient elemeket nyilvánvalóan nem tudja ClientInfo-ra konvertálni. Ráadásul ez nem a main threaden jön, hanem egy háttérszálon, vagyis nem a kliens fog egy faultexceptiont látni belőle, hanem az IIS egyszerűen bedarálja és újraindítja a szolgáltatást.
Ezen túl még olyan hiba is van, hogy egy foreach-en belül módosítod a listát. Ettől az enumerator meghülyül és ugyanúgy exception lesz az eredmény, vagyis ha módosítani akarsz, akkor érdemes a foreach-ben egy ToList()-tel lemásolni a listát (using System.Linq).
Hogy ezek után működni fog-e azt egyelőre még nem látom, de ezeket mindenképpen meg kellene oldani.
Továbbá én a helyedben úgy csinálnám meg a service-t, hogy külön dll-ben van, mert aköré könnyebb szervezni az életed mind fejlesztés mind beüzemelés közben. Fejlesztéskor a VS beépített WcfSvcHost fogja neked futtatni a szolgáltatást minden külső függőség nélkül (egy követelmény van csak: Any CPU-ra kell fordítani), telepítéshez meg csak köré kell szervezned egy külön projektként a "bootstrappert" legyen az IIS, Windows Service vagy egy egyszerű konzolos alkalmazás ami folyamatosan írja a logot a képernyőre.
-
bpx
őstag
az alkalmazásokhoz létre lehet (illetve van, ahol kell) hozni XML formátumú konfigurációs fájlokat (app.config, web.config, stb.), ami több okból is jó, pl. a program változtatása/újrafordítása nélkül is lehet befolyásolni a működését
ezt a ConfigurationManager osztállyal lehet könnyen feldolgozni
amit leírtál, az a konfig fájlból a megadott nevű ("vp.Properties.....") connectionstring XML elemre hivatkozik, és annak a connectionstring attribútumát adja vissza(#1631) Gregorius:
[link] (1.1MB a sok sallang miatt)
ha fordítani is szeretnéd, akkor kell pár dolog:
- VS2010 + .NET 4.0
- Silverlight 4 SDK
- Silverlight 4 Tools
- adatbázist (chess.bak) visszaállítani Management Studio-val (Sql Server 2008 Express) -
j0k3r!
őstag
hello!
a multkor segitettetek beallitani egy OleDbConnection ConnectionStringjet igy:
con.ConnectionString = ConfigurationManager.ConnectionStrings["vp.Properties.Settings.adatokConnectionString"].ConnectionString;ha valaki 1-2 mondatban leirna, hogy ez a ConfigurationManager mit csinal, azt megkoszonnem. (ha kell a komplett project hozza, akkor irjatok pm-et)
elore is koszonom.
-
bpx
őstag
válasz
Gregorius #1629 üzenetére
ez se oldotta meg - de az InstanceContext hasznos volt, nem kellenek statikus tagok, stb
közben próbálkoztam még pár dologgal, szálakat/listát máshogy szervezni, timeout-okkal játszani, de sehogy sem tökéletesjövő hét szerdán leadás, meg doksit is kellene írni hozzá, szóval lehet ez kimarad belőle
-
Gregorius
őstag
Egy gyors ötlet: dekoráld ki a ChessService-t ezzel:
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)]
Ez megoldhatja az aszinkron hívás gondot.A másik pedig hogy statikus memberek helyett ugyanebbe az attribba az InstanceContextMode.Single-t kell még beírni, mert így egy darab ojjektum létesül a szolgáltatáshoz és ez szolgálja ki az összes klienst. Ha meg egy sincs, akkor nem foglalja semmi az erőforrásokat, mert a szerver is eldobja az objektumot. Ebben az esetben viszont Reentrant helyett a ConcurrencyMode.Multiple kell.
-
bpx
őstag
válasz
Gregorius #1627 üzenetére
"Akár úgy, hogy egy extra metódushívást beleiktatsz a kontraktba, ami periodikusan küld egy dummy üzenetet"
igen, a PingRequest()/PingReply() kb. ezt csinálja
"A kódhoz kellene még a konfig is. Nagyon sok mindent jobbá lehet tenni vagy katasztrofálisan el lehet rontani egy WCF szolgáltatás konfigurációjával."
az a gond, hogy Silverlight vs. IIS duplex kommunikáció van (amit hát mégegyszer nem biztos, hogy így csinálnék, de most már ez van...), tehát muszáj pollingduplexhttpbinding-et használni (vagy még nettcpbinding-ot lehetne, de szerintem az én esetemben a clients lista konkurrens hozzáférésével lesz valami gond, nem a szolgáltatás konfigurációjával)
egyébként itt a konfig, semmi extra nincs benne (maxOutputDelay="00:00:01" - a kliens 1 mp-enként pollozzon, hogy jött-e neki üzenet)"Az mindenesetre már látszik, hogy ha void aszinkron hívásokat akarsz csinálni, akkor ajánlott az interfészen az OperationContract-ban megjelölni IsOneWay=true-ként és akkor nem kell külön szálat indítani minden ilyen híváshoz."
na ez egy érdekes dolog, ezt így is a csináltam, a kliens (callback channel) összes metódusa
[OperationContract(IsOneWay=true)]
void ... (...)alakú
ha nem így csináltam, akkor amikor a klienshez hozzáadtam a referenciát a szolgáltatáshoz (és feldolgozta a wsdl-t és generálta a megfelelő dolgokat), akkor dobott is egy warning-ot hogy ez így nem fog működni Silverlighttal - tehát ez megvan
ennek ellenére, ha szerver oldalon hívok egy ilyen függvényt, és közben már nincs is kliens - akkor ha lejár a bindingban megadott timeout (2 perc, default 1 perc) kivételt dob, sőt addig a 2 percig még blokkol is (ezért indítottam még ennek is külön threadet és raktam try..catch blokkba
-
Gregorius
őstag
azt szeretném észlelni, amikor meghal egy kliens, hogy a másik játékos ne csak üljön és várjon a semmire, hanem tudjam jelezni neki
Ezzel a problémával az elmúlt fél évben én is szembesültem, sajnos erre nincs univerzális megoldás. Saját magadnak kell valamilyen keepalive megoldást implementálni. Akár úgy, hogy egy extra metódushívást beleiktatsz a kontraktba, ami periodikusan küld egy dummy üzenetet, akár úgy, hogy a csatornához fejlesztesz hozzá egy nagy adag saját extension-t. Bizonyos esetekben (pl. basicHttpBinding) a csatorna állapotmentes, tehát elvileg sem észlelhető, hogy a kliens jobb létre szenderült, mert a holtidőben semmilyen kapcsolat nincs.A kódhoz kellene még a konfig is. Nagyon sok mindent jobbá lehet tenni vagy katasztrofálisan el lehet rontani egy WCF szolgáltatás konfigurációjával.
Az mindenesetre már látszik, hogy ha void aszinkron hívásokat akarsz csinálni, akkor ajánlott az interfészen az OperationContract-ban megjelölni IsOneWay=true-ként és akkor nem kell külön szálat indítani minden ilyen híváshoz.
-
bpx
őstag
válasz
Gregorius #1622 üzenetére
igen, erről is olvastam
csak átmenetileg oldotta meg a problémát, közben ugyanúgy megszívtam class-szal isúgyhogy segítséget kérnék
adott a következő szituáció:
IIS-en fut egy WCF szolgáltatás, amivel Silverlight kliensek kommunikálnak duplex módon
(silverlightos sakk, emberek belépnek a szerverre, majd egymás ellen tudnak játszani) - de ez lényegtelen, a konkurenciával van a gond
(azt szeretném észlelni, amikor meghal egy kliens, hogy a másik játékos ne csak üljön és várjon a semmire, hanem tudjam jelezni neki)
az ötlet a következőa szolgáltatásban van egy
static List<ClientInfo> clients;
private static readonly object syncLock = new object();ahol
public class ClientInfo
{
public string name; // játékos neve
public IChessClient client; // callback channel referencia
public DateTime lastreply; // utoljára mikor jött tőle válasz
}amikor a kliens hív a szerveren egy Login()-t, az csinál neki egy ClientInfo objektumot, és beteszi a listába
a szolgáltatás statikus konstruktorában csinálok 2 threadet:
- az egyik pl. 20 mp-ként küld egy kérést a klienseknek (PingRequest())
ezekre 1-2 mp múlva jön egy aszinkron válasz, mégpedig úgy, hogy a kliensek meghívják a szolgáltatás PingReply() fv-ét, ami bejegyzi a fenti listába, hogy most ebben az időpontban jött utoljára válasz adott klienstől- a másik meg pl. 60 mp-ként ellenőrzi a fenti clients listát, hogy kik azok, akik már mondjuk 2 perce nem válaszoltak
ezeket törli a clients listából, az ellenfelüket meg (ha van) értesítiahányszor hozzáférek a clients listához, mindig lock(syncLock)-ot használok a kölcsönös kizárás miatt
tehát 3 fő thread van (végrehajtó, "pingelő", ellenőrző)
a "végrehajtó" (Login(), PingReply()) csak ír
a "pingelő" csak olvas, és mindig helyes értéket lát
a probléma az ellenőrző threaddel van, ez olvassa és módosítja is a clients listátha csak 1 kliens van bejelentkezve, akkor minden megy rendben
ha több, akkor 1 db kliensnél nem látja a ClientInfo.lastreply aktuális értékét, hanem csak a létrehozáskori értéket (Login()) látja - viszont az összes többi kliensnél látja a friss értékeket
ez az 1 db ugye nem frissül, ha letelik X perc, a szerver úgy veszi hogy halott, törli
ilyenkor megint lesz 1 db másik, akinél nem látja az ezután érkező friss értékeket, őt is kiszórja
és ez így megy tovább, egyesével kiszór mindenkit amíg csak 1 játékos marad az egész szerveren, úgy hogy közben mindenki szépen válaszolt és folyamatosan volt kommunikáció, "ping"-re is jöttek válaszokha esetleg valaki eljutott volna idáig az olvasásban (
), [link] van kód is, csupaszítva, csak a lényeget meghagyva
-
Gregorius
őstag
Azonban a struct legnagyobb "hátránya", vagyis az érték szerinti hivatkozás mellett max. 16 KB lehet az összes taggal együtt
Az egyetlen limit, amibe bele lehet ütközni, az a stack overflow valahol 1M környékén (64-bites app esetén kicsit kevesebb, mint 32-bites esetén). De ekkora struct létrehozásához már komolyan trükközni kell egymásba ágyazásokkal, ugyanis a fordító belső limitje miatt egyetlen structnak sem lehet 64k darabnál több fieldje. De ez a limit ugyanúgy vonatkozik classokra is.Megjegyzem az ajánlott struct méret a pár tíz bájt alatt van. Ennél nagyobb structnál már valószínűleg hatékonyabb classt használni. Egy szint fölött túl nagy overhead az egész struct tartalom másolgatása az átadásokkor.
nincs automatikus GC sem
Milyen GC-nek kellene lennie? A struct pont azért tud hatékonyabb lenni adott helyen a classoknál, mert önmagában semmilyen GC-ben nem vesz részt. Ha a stacken foglal helyet, akkor pontosan akkor szabadul fel a memóriaterülete, amikor kiesik a scope-ból. Ellentétben egy class változó által mutatott objektumot adott esetben csak később gyűjt be a GC. Ha boxolva vagy más objektum részeként van a struct a heapen, akkor persze ugyanúgy GC-ződik, mint egy sima class, utóbbi esetben pontosan akkor szabadul fel a területe, mint a tartalmazó objektumé.Ezek szerint nem érdemes C#-ban struct-ot használni?
Kisméretű adatcsomagok tologatására érdemes, ahol szemantikailag is indokolt a használata. Illetve mint az elhangzott P/Invoke esetén gyakran ezt követeli meg a hívás.Van még pár teljesítményprobléma, ami ellenjavallja a structok használatát, de ezek nem a struct jellegéből adódnak, hanem a JIT fordító retardáltságából és idővel valószínűleg megoldódnak.
Továbbá van egy érdekes használati mintája a structnak: hatékony wrappert lehet vele írni, amikor az öröklődés nem megoldható. Ilyenkor ugyanis a struct csak egyetlen objektumreferenciát tartalmaz és ez másolódik mindenhova. Ez gyakorlatilag azt jelenti, hogy a struct többé-kevésbé class szemantikával működik, annak megfelelő a memóriafoglalása is, csak egy rakás másik metódust rá lehet aggatni.
-
válasz
robotjatek #1621 üzenetére
Nem érdemes, hacsak mondjuk nem képfeldolgozással foglalkozik valaki vagy esetleg natív kód felé interfészek írásakor lehet hasznos.
Azonban a struct legnagyobb "hátránya", vagyis az érték szerinti hivatkozás mellett max. 16 KB lehet az összes taggal együtt, mert a stack-ben tárolódik, kifelé egyetlen értéknek látszik és nincs automatikus GC sem! Ez pedig optimalizáltság szempontjából nem jó hír.
-
Gregorius
őstag
Pár félreértést eloszlatandó: a class is pontosan annyira threadsafe mint a struct: semennyire.
Az egyetlen különbség a kettő között - ami viszont nagyon komoly különbség - , hogy a classal ellentétben nem a referencia, hanem a tartalom utazik, ahogy passzolgatod. Vagyis a legalapvetőbb alkalmazások (pl. lokális változó) kivételével nem lehet az eredeti helyén egyenként módosítani a tagjait. Ha nem akarod elgáncsolni magad, akkor (kivételes esettől eltekintve) kizárólag immutable struktúrákat csinálsz, vagyis olyat, ami konstrukció után semmilyen formában sem változtatható. Így a fenti hiba koncepcionálisan kiküszöbölhető. -
bpx
őstag
ma egy ~2 órás kínlódás után saját káromon megtanultam, hogy C#-ban a struct nem threadsafe, még szinkronizációval sem, sajátos működési elvéből adódóan
persze mikor már nagyon gyanús volt a dolog, rákerestem neten, aztán rögtön felvilágosodtam ...gondoltam egyszerűsítek és class helyett structot csinálok, mert csak pár változó összerakása volt a cél egy struktúrába mindenféle függvény nélkül, hát helyette jól megszivattam magam...
-
Egyébként íme a javított verzió:
Console.WriteLine("Kérem adjon meg 3 számot 1-5 között, vesszővel elválasztva: ");
string s = Console.ReadLine();
int i = s.IndexOf(",");
string szam1 = s.Substring(0, 1);
string szam2 = s.Substring(i + 1, 1);
string szam3 = s.Substring(i + 3, 1);
int a = Convert.ToInt32(szam1);
int b = Convert.ToInt32(szam2);
int c = Convert.ToInt32(szam3);
int eredmény = (a + b + c) / 3;
Console.WriteLine(String.Format("az átlag: {0}", eredmény));
Console.ReadLine();Hibák:
- s.Substring(0) nem jó, kell a startIndex és a hossz, vagyis s.Substring(0,1), illetve így is jó, de az s.SubString(0) a teljes stringet fogja visszaadni.
- sok volt a ReadLine();
- kiíratásnál ez nem ír ki paramétert:
"az átlag: ", eredmény", mert nem mondtad meg neki, hogy a paramétert is írja ki.
A helyes használat felsorolás így:
"az átlag: {0}", eredmény". Ha több van, akkor "az átlag: {0}, {1}", eredmény, param2"A feladat maga 0/10 pont, mert értelmetlen, a megoldás 7/10, mert hibás volt. Átmentél, de a tanár nem.
-
Ez az egész feladat valóban primitív, ahogy írták... a kitalálója is az lehet. Most ez a jó vicc, hogy szívózik agy tanítani akar? Vagy csak menőzik, hogy végre sikerült valami kemény feladatot kitalálnia? "fasság"
Amúgy de, sajnos az IndexOf és a SubString kötelező elem, ha jól értem.
-
bpx
őstag
tessék, semmi double, char, semmi konverzió, de még indexof/substring se, mert ugye nem szabad/nem tanultátok...
lehet ezt csűrni-csavarni, meg a tanár hülyeségéhez ragaszkodni, és lesz egy ilyen förtelem belőle, inkább el se magyarázom, mert még elrettentő példának is sok és leírni is fájt:
static void Main(string[] args)
{
Console.WriteLine("Kérem adjon meg 3 számot 1-5 között, vesszővel elválasztva: ");
string szamok = Console.ReadLine();
Console.WriteLine("Átlag: {0}", (szamok[0] + szamok[2] + szamok[4] - 144) / 3);
Console.ReadLine();
}hozzászólásaitok alapján többet tanulhattok az itteniektől, mint attól a tanártól valaha fogtok
-
-
szuhib007
csendes tag
válasz
Lortech #1613 üzenetére
Hello! nekem is ez a feladat mert a vasinger oszt. társa vagyok ,de ezzel az a baj hogy mi ilyen "double" meg "GetNumericValue"-t meg "char"-t nem tanultunk,valami primitiv egyszerű dolgokkal kellene megcsinálni! elvileg a tanár aztmondta hogy először megkeresni az első vessző helyét,úgy visszaadni az első számot,aztán megkeresni a második vesszőt és abból visszaadni a 2ik és a 3ik számot és ezután a 3szám átlagát venni!Jólenne ha vki megcsinálná igy is
Köszönöm előre is a segitséget! -
Lortech
addikt
válasz
Vasinger! #1612 üzenetére
A formátum "x,y,z" ahol x,y,z rendre az 1..5 intervallum eleme?
Az érdekel, hogy lehet-e bárhol szóköz, tényleg csak egyszámjegyű lehet-e stb.
Ha igen, az általad elmondottak alapján még indexof és substring sem kell.Elmondom mit írtál:
string szam1 = s.Substring(0);szam1 itt egyenlő lesz a beírt szöveggel, mivel az 1 paraméteres substring azt jelenti, hogy a paraméterben kapott indextől visszaadja a stringet.
string szam2 = s.Substring(i + 1, 0);
Az i+1-es indextől kezdve 0 db hosszú stringet ad vissza, magyarul üres stringet.string szam3 = s.Substring(i + 3, 0);
Szintén,csak más indexszel.Console.WriteLine("az átlag: ", eredmény);
-Ez itt nem csinál sokat, ugyanis nem adtad meg a formátumstringben, hogy írja is ki az eredményt >>
Console.WriteLine("az átlag: {0}", eredmény);
vagy Console.WriteLine("az átlag: "+ eredmény);Ékezetet meg ne írjunk már változónévbe, mégha engedi is a fejlesztői környezet.
Olvasnod kéne a dokumentációját azoknak a függvényeknek, amit használsz, és nagyobb figyelmet fordítani rá.
Console.WriteLine("Kérem adjon meg 3 számot 1-5 között, vesszővel elválasztva: ");
string s = Console.ReadLine();
char szam1 = s[0];
char szam2 = s[2];
char szam3 = s[4];
double a = Char.GetNumericValue(szam1);
double b = Char.GetNumericValue(szam2);
double c = Char.GetNumericValue(szam3);
int eredmeny = (int)(a + b + c) / 3;
//ha nem elég az egész osztás, használd ezt
//double eredmeny = (a + b + c) / 3;
Console.WriteLine("az átlag: {0}", eredmeny);
Console.ReadLine();--Convert.ToInt32
- ez a karakterkódját fogja visszaadni a karakternek, nem pedig a számot magát char típus esetében, stringnél a számot. (toStringelni is lehetett volna a szam1,2,3-at).Ha nem használhatsz Char.GetNumericValue-t, akkor használhatsz még int.Parse-t is, a Convert.ToInt32 mellett.
-
Vasinger!
nagyúr
Nos írtam, hogy kell egy olyan program ami ha 3 számot beírunk vesszővel elválasztva, átlagát veszi.
Írtatok 3-an is programot ide nekem, csak egyik sem jó. Mert index of-fal és substringgel szabad csak dolgoznom. Feltételeket, tömböket, ciklusokat meg még nem vettük.
Semmi feltétel nem kell, csak az átlagot beírni, ha nem jól írjuk be akkor fagyjon le a progi.{
Console.WriteLine("Kérem adjon meg 3 számot 1-5 között, vesszővel elválasztva: ");
string s = Console.ReadLine();
int i = s.IndexOf(",");
string szam1 = s.Substring(0);
string szam2 = s.Substring(i + 1, 0);
string szam3 = s.Substring(i + 3, 0);
int a = Convert.ToInt32(szam1);
int b = Convert.ToInt32(szam2);
int c = Convert.ToInt32(szam3);
int eredmény = (a + b + c) /3;
Console.ReadLine();
Console.WriteLine("az átlag: ", eredmény);
Console.ReadLine();
}Nos én idáig jutottam, de ez nem megy. 5let?
Sürgős lenne, még ma kész kéne lenni.
-
Látom, van már egy User típusod (Entity Data Model-ből van?), aminek gondolom egy property-je a UserId. EF-nek annyi kell, hogy megadod a lekérdezést, ami az Id alapján kiveszi a nevet (talán user.UserId?).
Sajnos ennyire általános kérdésre csak általánosan lehet válaszolni.
-
emmm
őstag
Sziasztok!
Egy új munkahelyen dolgozok éppen, és Juniorként elakadtam kissé. Még az alap dolgok sem teljesen tiszták (azért egy öröklődést tudok használni!).
Az aktuális problémám az lenne, hogy egy weblapon szeretnék bekérni egy adatot, pl. egy textboxban - ami szeretnék, az egy UserId - és egy gomb megnyomásával egy másik tesztboxba kiírja a hozzá tartozó User nevét.
Mindezt Entity Frameworkkel és WCF-fel kell megoldanom (.NET 4.0, C#).Addig világos, hogy a gombot megnyomom, az lekéri a beírt adatot. Valami olyasmi elképzelésem volt, hogy létrehozok egy User objektumot, és a UserId mezőjébe beleteszem a Textboxba írt értéket. Majd ezt átküldöm a GetUserNameBack metódusnak.
De ebből hogy lesz UserNév?
A Service oldalon (Service1: Iservice résznél):
public string GetUserNameBack(User user)
{
LibraryEntity le = new LibraryEntity();using (var ctx = new LibraryEntity())
{//ide kéne valami, csak nem tudom, mi...
}
}Vagy elég csak a bekért adatot átküldenem? És akkor hogyan kell megoldani?
Nagyon megköszönném a segítséget!
-
Vasinger!
nagyúr
Ó emberek köszönöm mindenkinek.
Majd ha lesz időm megnézem őket a 7végén.Kicsit talán túl sokat csináltatok, nem kellett volna bele feltétel vagy egyéb okosságok.
De azért köszi! Írok ha van valami kérdésem. -
válasz
ArchElf #1607 üzenetére
"Olyan sikeresen, hogy miután "megtanultunk" c-ben 20 óra alatt programozni mindenki sikeresen beadott egy tetszőleges párhuzamosítható probléma többszálas megoldását c-ben linux alá (IPC) megvalósítva..."
Ez ismerős. Nekem is volt hasonló progtanárom. Sosem tanított suliban olyan ember programozásra, aki ebből is élt volna - pedig jó pár nyelvet kellett tanulni. Többet tanultam a suli után 2 hónap alatt, mint addig évek alatt.
-
ArchElf
addikt
Bocs
Write-only üzemmódban voltam - mint általában; ráadásul rendesen túl is bonyolítottam...
A példa minősítésével egyetértek... Nálunk a főiskolán a tanár legnagyobb (saját) programozási eredménye az volt, hogy gombnyomásra át tudta színezni egy textbox hátterét. Látnod kellett volna az arcát, hogy öntötte el a büszkeség komoly műve láttán.
Nem is - egyszer könyvből kimásolt egy drag-and-drop példát (kijelölt elemek áthúzása egyik listboxból a másikba) - igaz megértenie nem sikerült hogy működik, mert egész órán hegesztette, de többet nem tudott kihozni belőle.A másik, amin mosolyogni szoktam, ha eszembe jut(tatják): könyvből leggyorsabban 24 óra alatt lehet megtanulni programozni. Nálunk ez az egyetemen sikerült 20 óra alatt. Olyan sikeresen, hogy miután "megtanultunk" c-ben 20 óra alatt programozni mindenki sikeresen beadott egy tetszőleges párhuzamosítható probléma többszálas megoldását c-ben linux alá (IPC) megvalósítva...
Asszem egy emberről tudok a mi évfolyamunkban, akinek ez saját munkája volt.
AE
-
válasz
WonderCSabo #1603 üzenetére
Nem lehet. Az ékezet ugyanolyan gonosz, mint a goto. ez a hunglish nézet szerencsére ideje korán elsorvadt
ArchElf:
Elnézést, nem ellened irányult az előbbi, de tényleg soha nem használjuk, sehol - talán suliban, de annak a való élethez 0 köze van, amit ott leadnak sokszor."Ennyi erővel a substring sem volt benne a kiírásban"
De, ez benne volt. SubString és IndexOf, más nem.
Generikusokkal vagy még inkább regex-szel ezt pikk-pakk meg lehet oldani. Ráadásul az IndexOf lassú is.
-
ArchElf
addikt
válasz
WonderCSabo #1603 üzenetére
Lehet, még classnév is lehet akármi unicode. Én amúgy nem szoktam használni, csak ilyen hülye példáknál. Sztenderd angol, azt kakukk...
AE
-
ArchElf
addikt
Ennyi erővel a substring sem volt benne a kiírásban
Mondjuk jó kis feladat lehet substring és Convert nélkül, csak IndexOf-al is
try/catch-et bele sem mertem raknifor lol:
static void Main(string[] args)
{
double átlag = 0;
int szám = 0;
int index = 0;
int újindex = 0;
int számláló = 0;
string számok = "12345";
Console.Write("Kérem adjon meg 3 számot 1-5 között, vesszővel elválasztva: ");
string számsor = Console.ReadLine();
//INDEXOF
while (számláló < 3)
{
újindex = számsor.IndexOf(',', index);
if (újindex < 0 && számláló != 2)
{
Console.Error.WriteLine("Nincs elég szám.");
return;
}
if ((újindex - index != 1) && számláló != 2)
{
Console.Error.WriteLine("Helytelen adatok");
return;
}
szám = számok.IndexOf(számsor[index]) + 1;
if (szám < 1 || szám > 5)
{
Console.Error.WriteLine("Helytelen adatok");
return;
}
átlag += szám;
index = újindex + 1;
számláló++;
}
Console.WriteLine("Az átlag: {0:0.0}", átlag / 3);
}AE
-
válasz
Vasinger! #1595 üzenetére
Idióta egy feladat... legalább életszerű példa lenne, de ebből így mit tanulsz meg? Gyakorlatilag semmit. Na mindegy.
Szóval az a lényeg, hogy az IndexOf megkeresi az első "," karakter indexét a beolvasott stringben (csak azt vizsgáltam, ha nem üres, de azt is kellene, ha nincs "," benne, meg nincs intre ellenőrzés, meg a szám 1-5 közöttre sem). A string elejéről indulva először a 0. karaktertől keressük. Ha találtunk és még nem értük el a string végét, akkor az előbb megtalált index mögé tesszük a következő körben az IndexOf kiindulási pontját, így már a másodikat fogja megtalálni. Ha még mindig nem értük el a fájl végét, megyünk még egy kört, de már nincs több ",".
Közben az index előtti karaktert számmá alakítva egy összeghez adjuk. Így már meg is van két szám és mivel tudjuk, hogy csak 1 számjegyű számaink vannak, az utolsót úgy vesszük ki, hogy a string vége előtti karaktert alakítjuk számmá és adjuk az összeghez. Közben egy darabszámot növelgetünk 1-től és a végén átlagolunk.
Bugyuta, értelmetlen, de nem egyszerű feladat. Sok szebb, gyorsabb, egyszerűbb megoldás lenne rá.
A kód:
private static void Main(string[] args)
{
string str = Console.ReadLine();
double szum = 0;
if (!String.IsNullOrEmpty(str))
{
int end = str.Length;
int start = 0;
int indexOf = 0;
int darab = 1;
while ((start <= end) && (indexOf > -1))
{
indexOf = str.IndexOf(",", start);
if (indexOf == -1) break;
szum += Convert.ToInt32(str.Substring(indexOf - 1, 1));
start = indexOf + 1;
darab++;
}
szum += Convert.ToInt32(str.Substring(str.Length - 1, 1));
Console.WriteLine(@"Az összeg: {0}",szum);
Console.WriteLine("-----------");
Console.WriteLine(@"Az átlag: {0}", szum/darab);
}
Console.ReadLine();
}ArchElf:
A tanár talán azt sem tudja, mi a TryParse, én bele se mertem tenni, meg a tömb csalás... nem volt benne a kiírásban. -
ArchElf
addikt
válasz
Vasinger! #1599 üzenetére
Nem kommenteltem, de szerintem a magyar nevű változók elég beszédesek: PasteBin link
Persze sokkal egyszerűbben is lehetett volna, de szerettem volna úgy megírni, hogy minél több - azért lehetőleg kevéssé felesleges - elem legyen benne.Amúgy splittel tényleg egyszerűbb, nincs az a felesleges ciklusozás:
string[] számok_s = számsor.Split(',');
if (számok_s.Length != SZÁMOK_SZÁMA)
{
Console.Error.WriteLine("A beadott számok száma nem {0}.", SZÁMOK_SZÁMA);
return;
}
foreach (string szám_s in számok_s)
{
if (!int.TryParse(szám_s.Trim(), out számok[számláló]))
{
Console.Error.WriteLine("A {0}. helyen nem szám van.", számláló);
return;
}
else if (számok[számláló] < 1 || számok[számláló] > 5)
{
Console.Error.WriteLine("A {0}. helyen a szám nem 1-5 között van.", számláló);
return;
}
}AE
Új hozzászólás Aktív témák
Hirdetés
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- Apple iPhone 16 Pro Max - Desert Titanium - 256GB 1 ciklus 100% akku! 1 év garancia! Új készülék!
- PNY EPIC-X RGB RTX 5060Ti 16GB / Gigabyte EAGLE OC RTX 5070 12GB videokárty 3 év garancia 27% áfa
- Oppo Reno7 5G 256GB, Kártyafüggetlen, 1 Év Garanciával
- Csere-Beszámítás! Felsőkategóriás számítógép PC Játékra! I9 13900KF / RTX 4080 / 32GB RAM / 1TB SSD
- ÁRGARANCIA!Épített KomPhone Ryzen 7 7800X3D 32/64GB RAM RTX 5070 GAMER PC termékbeszámítással
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest