Ytterst underligt problem i C# .net

Permalänk
Medlem

Ytterst underligt problem i C# .net

Hejsan SweClockers, eller alla medlemmar iaf

Håller på att bygga ett program som "startar ditt cod" låter rätt ointressant men det är mer logiskt än vad man kan tro.

I vilket fall som helst har jag stött på ett ytterst underligt problem med en funktion jag har skapat.

Funktionen ser ut så här i grunden:

public static string[] ListMaps(string path) { DirectoryInfo MapsFolder = new DirectoryInfo(path); FileInfo[] Maps = MapsFolder.GetFiles(); string[] MapArray = new string[Maps.Length]; for (int i = 0; i < Maps.Length; i++) { string CurrentMap = Maps[i].ToString(); if (CurrentMap.ToLower().StartsWith("mp_")) { CurrentMap = CurrentMap.TrimEnd(new char[2] {'f', '.'}); MapArray[i] = CurrentMap; } } return MapArray; }

det den ska göra är alltså filtrera ut alla filer som inte börjar med mp, och lägga till dem i arrayen "MapArray" sedan returnera den.

Nu till det intressanta.
Funktionen VÄGRAR filtrera ut filerna som börjar med "mp_"
Allt annat går bra, och jag är helt förundrar över detta sinnesjuka fel.
Har även provat med andra varianter som

if (CurrentMap.ToLower().Split('_')[0] == "mp")

Någon som vet hur man löser detta? Eller missare jag helt enkelt det uppenbara?
Om jag nu missat det uppenbara så skyller jag på sjukdom.

Tack på förhand : D

Visa signatur

Fractal Design Define R3 ~ Asus M4A78-E ~ Powercolor HD5850 1Gb ~ AMD Phenom II 965 ~ Thermalright True Black ~ Corsair XMS2 @ 1066mhz

Permalänk

Testa:

public static string[] ListMaps(string path) { return new DirectoryInfo(path).GetFiles().Where(c=>c.FileName.ToUpperInvariant().StartWith(MP)); }

Tror att felet är att du anropar ToString på FileInfo. Ger det verkligen filnamnet och inte hela sökvägen?

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem
Skrivet av KurreKula:

Testa:

public static string[] ListMaps(string path) { return new DirectoryInfo(path).GetFiles().Where(c=>c.FileName.ToUpperInvariant().StartWith(MP)); }

Tror att felet är att du anropar ToString på FileInfo. Ger det verkligen filnamnet och inte hela sökvägen?

Låter intressant, dock är inte problemet att sökvägen är fel eller något sådant, för den hittar alla filer där, och returnerar dem om jag tar bort if-satsen helt och hållet.
fungerar även om jag byter ut .StartsWith("ac") eller nåt annat (visar banan "ac130.ff")
kan det vara understrecket som på något sätt gör så att strängen ballar ur? vilket inte heller borde spela någon roll eftersom understrecket är en del av strängen precis som allt annat?

Jag är ljupt förundrad över detta.

Visa signatur

Fractal Design Define R3 ~ Asus M4A78-E ~ Powercolor HD5850 1Gb ~ AMD Phenom II 965 ~ Thermalright True Black ~ Corsair XMS2 @ 1066mhz

Permalänk

Ligger filerna i undermappar?

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Hedersmedlem

Får jag bara fråga (kan inget c# men kodar ofta java), varför returnera en array där många element är null?

Visa signatur

Every time you create an iterator: God kills a kitten.

Permalänk
Skrivet av 'Gi:

[Gurra;10728705']Får jag bara fråga (kan inget c# men kodar ofta java), varför returnera en array där många element är null?

+1. Hela funktionen är lite halvskum.

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem
Skrivet av KurreKula:

Ligger filerna i undermappar?

Nix

Skrivet av 'Gi:

[Gurra;10728705']Får jag bara fråga (kan inget c# men kodar ofta java), varför returnera en array där många element är null?

Helt korrekt, det flesta elementen i arrayen kommer vara null.
Tack så mycket
Ska fixas omgående.

Dock svarar det inte på varför den inte visar filerna?

Skrivet av KurreKula:

+1. Hela funktionen är lite halvskum.

Ska göra om den, återkommer.

Visa signatur

Fractal Design Define R3 ~ Asus M4A78-E ~ Powercolor HD5850 1Gb ~ AMD Phenom II 965 ~ Thermalright True Black ~ Corsair XMS2 @ 1066mhz

Permalänk

Ligger de med i listan du får? Använd intellisense och kolla alla värden när du felsöker

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem
Skrivet av KurreKula:

Ligger de med i listan du får? Använd intellisense och kolla alla värden när du felsöker

Ligger vad med i listan?

Körde med en breakpoint på if-satsen, det visade sig att alla värden blir tillagda i Arrayen, men den kanske ignoreras efter som många av elementen är null?

Visa signatur

Fractal Design Define R3 ~ Asus M4A78-E ~ Powercolor HD5850 1Gb ~ AMD Phenom II 965 ~ Thermalright True Black ~ Corsair XMS2 @ 1066mhz

Permalänk
Skrivet av Fixz92:

Ligger vad med i listan?

Körde med en breakpoint på if-satsen, det visade sig att alla värden blir tillagda i Arrayen, men den kanske ignoreras efter som många av elementen är null?

Alltså, du skapar ju en ny lista med lika många värden som den första även fast du vet att alla värden inte kommer att börja med det som du har filtrerat på.

Används linq istället, snabbare, mindre kod och lättare.

Menade alla filer som du får med getfiles

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem

Jag löste det i varje fall. Körde en ArrayList i stället, och returnerade den som en string array:

public static string[] ListMaps(string path) { DirectoryInfo MapsFolder = new DirectoryInfo(path); FileInfo[] Maps = MapsFolder.GetFiles(); ArrayList MapArray = new ArrayList(); for (int i = 0; i < Maps.Length; i++) { string CurrentMap = Maps[i].ToString(); if (CurrentMap.ToLower().StartsWith("mp_")) { CurrentMap = CurrentMap.TrimEnd(new char[2] { 'f', '.' }); MapArray.Add(CurrentMap); } } return MapArray.ToArray(Type.GetType("System.String")) as string[]; }

Skrivet av KurreKula:

Alltså, du skapar ju en ny lista med lika många värden som den första även fast du vet att alla värden inte kommer att börja med det som du har filtrerat på.

Används linq istället, snabbare, mindre kod och lättare.

Menade alla filer som du får med getfiles

Vet att min kod är långt från "optimal".
Är QuakeC kodare i grunden, därav min "skumma kod".

Skulle gärna använda Linq om jag visste hur
Läser Prog C på distans och vår lärare är väl långt i från kapabel att lära ut Programmering C.

Tack för all hjälp grabbar (och flickor?)
om ni har några synpunkter på koden är det bara att säga till.

Visa signatur

Fractal Design Define R3 ~ Asus M4A78-E ~ Powercolor HD5850 1Gb ~ AMD Phenom II 965 ~ Thermalright True Black ~ Corsair XMS2 @ 1066mhz

Permalänk
Skrivet av Fixz92:

Jag löste det i varje fall. Körde en ArrayList i stället, och returnerade den som en string array:

public static string[] ListMaps(string path) { DirectoryInfo MapsFolder = new DirectoryInfo(path); FileInfo[] Maps = MapsFolder.GetFiles(); ArrayList MapArray = new ArrayList(); for (int i = 0; i < Maps.Length; i++) { string CurrentMap = Maps[i].ToString(); if (CurrentMap.ToLower().StartsWith("mp_")) { CurrentMap = CurrentMap.TrimEnd(new char[2] { 'f', '.' }); MapArray.Add(CurrentMap); } } return MapArray.ToArray(Type.GetType("System.String")) as string[]; }

Vet att min kod är långt från "optimal".
Är QuakeC kodare i grunden, därav min "skumma kod".

Skulle gärna använda Linq om jag visste hur
Läser Prog C på distans och vår lärare är väl långt i från kapabel att lära ut Programmering C.

Tack för all hjälp grabbar (och flickor?)
om ni har några synpunkter på koden är det bara att säga till.

Testade du koden jag skrev ovan? Bör genomföra samma sak. Du får dock lägga till en "ToArray()"

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem
Skrivet av KurreKula:

Testade du koden jag skrev ovan? Bör genomföra samma sak. Du får dock lägga till en "ToArray()"

Försökte, fick det inte att fungera speciellt bra.

Visa signatur

Fractal Design Define R3 ~ Asus M4A78-E ~ Powercolor HD5850 1Gb ~ AMD Phenom II 965 ~ Thermalright True Black ~ Corsair XMS2 @ 1066mhz

Permalänk
Skrivet av Fixz92:

Försökte, fick det inte att fungera speciellt bra.

Dårå?

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem
Skrivet av KurreKula:

Fick den inte att returna en string-array
Kändes lite surt då.

Time to kick back, dock ska spela lite blackops innan jag kryper till kojjs.

Visa signatur

Fractal Design Define R3 ~ Asus M4A78-E ~ Powercolor HD5850 1Gb ~ AMD Phenom II 965 ~ Thermalright True Black ~ Corsair XMS2 @ 1066mhz

Permalänk
Skrivet av Fixz92:

Fick den inte att returna en string-array
Kändes lite surt då.

Time to kick back, dock ska spela lite blackops innan jag kryper till kojjs.

Detta ska funka:

public static string[] ListMaps(string path) { return new DirectoryInfo(path).GetFiles().Select(c=>c.FileName).Where(c=>c.ToUpperInvariant().StartWith("MP_")).ToArray(); }

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Hedersmedlem
Skrivet av KurreKula:

Detta ska funka:

public static string[] ListMaps(string path) { return new DirectoryInfo(path).GetFiles().Select(c=>c.FileName).Where(c=>c.ToUpperInvariant().StartWith("MP_")).ToArray(); }

Nästan:

static string[] ListMaps(string path) { return new DirectoryInfo(path).GetFiles().Select(c => c.Name).Where(c => c.ToUpperInvariant().StartsWith("MP_")).ToArray(); }

Om man kan leva med de fulla sökvägarna duger väl annars:

static string[] ListMaps(string path) { return System.IO.Directory.GetFiles(path, "mp_*.*"); }

Permalänk
Skrivet av Elgot:

Nästan:

static string[] ListMaps(string path) { return new DirectoryInfo(path).GetFiles().Select(c => c.Name).Where(c => c.ToUpperInvariant().StartsWith("MP_")).ToArray(); }

Om man kan leva med de fulla sökvägarna duger väl annars:

static string[] ListMaps(string path) { return System.IO.Directory.GetFiles(path, "mp_*.*"); }

Tusan, skrev från minnet

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem
Skrivet av Elgot:

Nästan:

static string[] ListMaps(string path) { return new DirectoryInfo(path).GetFiles().Select(c => c.Name).Where(c => c.ToUpperInvariant().StartsWith("MP_")).ToArray(); }

Om man kan leva med de fulla sökvägarna duger väl annars:

static string[] ListMaps(string path) { return System.IO.Directory.GetFiles(path, "mp_*.*"); }

Tack Elgot, funkar.
Dock uppfyller det inte riktigt "kraven".
det jag egentligen vill göra är att.

Ta alla filer som ligger i Cod4 mappen zone/english, och lista dem i en combo-box.
Då duger det tyvärr inte med hela sökvägen ^^

Ni verkar förövrigt väldigt besatta av att göra så all kod är på en rad. xD
Jag vet att en tumregel är att du ska skriva så lite kod som möjligt men detta är ju löjligt nästan

Visa signatur

Fractal Design Define R3 ~ Asus M4A78-E ~ Powercolor HD5850 1Gb ~ AMD Phenom II 965 ~ Thermalright True Black ~ Corsair XMS2 @ 1066mhz

Permalänk
Medlem

Skulle även vara trevligt om någon kunde förklara System.Linq.Where()

Tack på förhand

Visa signatur

Fractal Design Define R3 ~ Asus M4A78-E ~ Powercolor HD5850 1Gb ~ AMD Phenom II 965 ~ Thermalright True Black ~ Corsair XMS2 @ 1066mhz

Permalänk
Medlem

Tja som jag fattar det så vill du lista alla filer i flertal mappar nu har jag inte en blekaste aning om deras foderstruktur men t.ex. här under har du hur du listar filer i subfoldrar o.s.v. Läs MSDN finns mycket tips att få här.

http://msdn.microsoft.com/en-us/library/ms143327%28v=VS.90%29...

DirectoryInfo di = new DirectoryInfo(path); DirectoryInfo[] directories = di.GetDirectories("*.*", SearchOption.AllDirectories);

Ligger mapparna helt o hållet på olika ställen och du vill bygga upp en lista med alla filer i olika mappar kan du spara undan alla FileInfo's i en lista
List<FileInfo> files = new List<FileInfo>();

använder metoderna ListMaps skrivna ovanför
Sedan använderdu .AddRange

files.AddRange(ListMaps("path")); files.AddRange(ListMaps("path2")); files.AddRange(ListMaps("path3"));

Så har du en lista med allt.
http://msdn.microsoft.com/en-us/library/z883w3dc%28v=vs.80%29...

LINQ:
Sedan när du frågar om Where så måste du lära dig LINQ, lika bra du pluggar eller köper en bok om det området, utöver det ifall du vill förstå den korta raden skriven ovan måste du lära dig Lambda expresspions med. Men som sagt va det är inga grundläggande programmerings tekniker.

http://msdn.microsoft.com/en-us/library/bb397933.aspx

Som sagt va, lär dig använda MSDN först o främst så lär du slippa större delen av dina frågor.

Visa signatur

Speldator: i7-8700k, 32GB DDR4, RTX2080
Server 1: SB 2500k, MZI -P67GD55, 32GB DDR3, Corsair MX 240GB SSD
Surface Pro 2017, Konsoler: Typ alla, Oculus Rift

Permalänk
Skrivet av Fixz92:

Tack Elgot, funkar.
Dock uppfyller det inte riktigt "kraven".
det jag egentligen vill göra är att.

Ta alla filer som ligger i Cod4 mappen zone/english, och lista dem i en combo-box.
Då duger det tyvärr inte med hela sökvägen ^^

Ni verkar förövrigt väldigt besatta av att göra så all kod är på en rad. xD
Jag vet att en tumregel är att du ska skriva så lite kod som möjligt men detta är ju löjligt nästan

Detta funkar ju precis så som du säger och kräver bara en rad. Handlar inte om att fokusera på att skriva allt på en rad utom att inte göra en massa jobb som redan är gjort. Om en rad kod funkar bättre och snabbare än dina 15 rader så varför inte?

static string[] ListMaps(string path) { return new DirectoryInfo(path).GetFiles().Select(c => c.Name).Where(c => c.ToUpperInvariant().StartsWith("MP_")).ToArray(); }

Skrivet av Fixz92:

Skulle även vara trevligt om någon kunde förklara System.Linq.Where()

Tack på förhand

Det är som i SQL. Du tar en lista och sen tar du ut bara det som uppfyller kriteriet. I det här fallet kriteriet att namnet börjar med det som du nu vill

För övrigt kan du ju, om du inte vill ha kvar sökvägen alltid köra:

Path.GetFileNameWithoutExtension(path);

eller

Path.GetFileName(path);

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Hedersmedlem
Skrivet av Fixz92:

Då duger det tyvärr inte med hela sökvägen ^^

När man väl har en lista med fullständiga sökvägar är det dock lätt att för varje element plocka ut endast filnamnet.

Permalänk
Skrivet av Fixz92:

Tack Elgot, funkar.
Dock uppfyller det inte riktigt "kraven".
det jag egentligen vill göra är att.

Ta alla filer som ligger i Cod4 mappen zone/english, och lista dem i en combo-box.
Då duger det tyvärr inte med hela sökvägen ^^

Ni verkar förövrigt väldigt besatta av att göra så all kod är på en rad. xD
Jag vet att en tumregel är att du ska skriva så lite kod som möjligt men detta är ju löjligt nästan

Skrivet av Elgot:

När man väl har en lista med fullständiga sökvägar är det dock lätt att för varje element plocka ut endast filnamnet.

Japp, som nämnt ovan så finns det massa statiska funktioner på Path-klassen

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem
Skrivet av Elgot:

När man väl har en lista med fullständiga sökvägar är det dock lätt att för varje element plocka ut endast filnamnet.

True Dat. Skulle dock göra lite annat krapp med strängen så jag körde "my way"

Skrivet av MugiMugi:

Tja som jag fattar det så vill du lista alla filer i flertal mappar nu har jag inte en blekaste aning om deras foderstruktur men t.ex. här under har du hur du listar filer i subfoldrar o.s.v. Läs MSDN finns mycket tips att få här.

http://msdn.microsoft.com/en-us/library/ms143327%28v=VS.90%29...

DirectoryInfo di = new DirectoryInfo(path); DirectoryInfo[] directories = di.GetDirectories("*.*", SearchOption.AllDirectories);

Ligger mapparna helt o hållet på olika ställen och du vill bygga upp en lista med alla filer i olika mappar kan du spara undan alla FileInfo's i en lista
List<FileInfo> files = new List<FileInfo>();

använder metoderna ListMaps skrivna ovanför
Sedan använderdu .AddRange

files.AddRange(ListMaps("path")); files.AddRange(ListMaps("path2")); files.AddRange(ListMaps("path3"));

Så har du en lista med allt.
http://msdn.microsoft.com/en-us/library/z883w3dc%28v=vs.80%29...

LINQ:
Sedan när du frågar om Where så måste du lära dig LINQ, lika bra du pluggar eller köper en bok om det området, utöver det ifall du vill förstå den korta raden skriven ovan måste du lära dig Lambda expresspions med. Men som sagt va det är inga grundläggande programmerings tekniker.

http://msdn.microsoft.com/en-us/library/bb397933.aspx

Som sagt va, lär dig använda MSDN först o främst så lär du slippa större delen av dina frågor.

Kollar alltid MSDN och googlar runt först.
Dock var inte det ursprungliga problemet att Jag inte kunda använda Linq eller något sånt, men det problemet är löst nu ^^,
Ska läsa på inom LINQ och Lamda Expressions när jag blivit frisk.
Jättefin Post. Jag tackar så mycket.

Skrivet av KurreKula:

Detta funkar ju precis så som du säger och kräver bara en rad. Handlar inte om att fokusera på att skriva allt på en rad utom att inte göra en massa jobb som redan är gjort. Om en rad kod funkar bättre och snabbare än dina 15 rader så varför inte?

static string[] ListMaps(string path) { return new DirectoryInfo(path).GetFiles().Select(c => c.Name).Where(c => c.ToUpperInvariant().StartsWith("MP_")).ToArray(); }

Det är som i SQL. Du tar en lista och sen tar du ut bara det som uppfyller kriteriet. I det här fallet kriteriet att namnet börjar med det som du nu vill

För övrigt kan du ju, om du inte vill ha kvar sökvägen alltid köra:

Path.GetFileNameWithoutExtension(path);

eller

Path.GetFileName(path);

Tack du kortade ned min kod ytterliggare

Visa signatur

Fractal Design Define R3 ~ Asus M4A78-E ~ Powercolor HD5850 1Gb ~ AMD Phenom II 965 ~ Thermalright True Black ~ Corsair XMS2 @ 1066mhz