C# Slå ihop olika antal arrayer till en stor

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Sep 2004

C# Slå ihop olika antal arrayer till en stor

Hej,

jag försöker göra ett program i konsol läge som ska kunna blanda/sortera och skapa ett antal kortlekar.

Jag har just börjat med uppgiften och har aldrig tidigare programmerat C# men har programmerat både C och C++, och ett gäng andra språk. Dock senast runt 2005, så jag är en aning ringrostig.

Nu till mitt problem, jag skapar en kortlek på 52 kort, som ger korten ett värde, en valör och ett kortleksnummer med hjälp följande funktion:

public Deck(double NoDeck) { string[] Value = { "E", "2", "3", "4", "5", "6", "7", "8", "9", "10", "KN", "D", "K" }; string[] Suit = { "Hjärter", "Ruter", "Spader", "Klöver" }; deck = new Card[NO_OF_C]; currentCard = 0; RandNo = new Random(); for (int count = 0; count < deck.Length; count++) deck[count] = new Card(Value[count % 13], Suit[count / 13], NoDeck); }

Men jag behöver en funktion som skapar en array där ett, av användaren givet nummer, antal kortlekar som jag sedan ska kunna sortera, blanda mm tillsammans, hur f*n gör jag detta?

Någon som kan hjälpa med detta?

mvh Peter

WS1: | Asus VI Hero | i7 4770K | 16gb Corsair Vengence | Asus RX 470 Strix | Corsair AX650 | Jonsbo UMX4 | Corsair H100 | SRVR: | Asus E35M1-I | 4gb | FD Array |Laptop: | HP 8440p | I7-620 | 4gb | NVS-3100 | 14" |

Trädvy Permalänk
Medlem
Plats
åkersberga, Täby
Registrerad
Jun 2004

Jag antar att du får ta reda på de ursprungliga arrayernas storlek & sedan addera dem med varandra.

t.e.x.

int storlek = storlek av array1 + storlek av array 2

Skicka sedan storlek som parameter tillsammans med de ursprunglgia arrayerna till en class som skapar en ny array med den nya storleken.

loopa sedan igenom de gamla arrayerna & lägg alla värden i den nya.

Finns säkert smidigare sätt

VH

Dator 1.
FX 8350 4.7Ghz | 24GB ram | MSI Radeon RX 480 | Kingston SSD | Fractal design R2.0 | PSU : Fractal 650W
Dator 2 (Bärbar). HP Folio 9470m

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Sep 2008

@pekkasteele: Om du är intresserad av bra algoritmer, kolla på mergesort och quicksort (Denna är att föredra i c++). Om du däremot vill ha en lätt algortim, men som inte är att föredra då den är väldigt långsam (i större program. Om du bara ska sortera kortlekar funkar denna fint för ditt syfte) kan du kolla på selectionsort.

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Sep 2004

@Razki: Tack ska kolla på det när jag kommer så långt!

@martin_cs: Tackar! Får försöka med detta!

WS1: | Asus VI Hero | i7 4770K | 16gb Corsair Vengence | Asus RX 470 Strix | Corsair AX650 | Jonsbo UMX4 | Corsair H100 | SRVR: | Asus E35M1-I | 4gb | FD Array |Laptop: | HP 8440p | I7-620 | 4gb | NVS-3100 | 14" |

Trädvy Permalänk
Medlem
Registrerad
Dec 2015

@pekkasteele: Ursäkta om jag föreslår en alternativ lösning i stället för att svara på frågan: Du kommer att spara massor av tid i längden om du slutar använda Array-klassen och börjar använda System.Collections.Generic.List<T> i stället. Om du har kodat C++ så är generics i C# mycket likt templates.

List<T> har en []-operator som är O(1) så prestanda är oftast inga problem (den implementeras internt med en Array<T>). Den har även AddRange()-metoden för att slå ihop två listor, precis det du vill, och du får mycket inbyggt framework-stöd för sortering etc. Jag använder i princip bara Array-klassen när jag behöver hantera bytes.

Trädvy Permalänk
Medlem
Registrerad
Apr 2013

http://stackoverflow.com/questions/59217/merging-two-arrays-i...

Där finner du bra exempel på hur man kan slå ihop två arrayer.

Citat:

n C# 3.0 you can use LINQ's Concat method to accomplish this easily:

int[] front = { 1, 2, 3, 4 };
int[] back = { 5, 6, 7, 8 };
int[] combined = front.Concat(back).ToArray();

Still play with birds like I hang with mother goose.

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Sep 2004
Skrivet av KAD:

@pekkasteele: Ursäkta om jag föreslår en alternativ lösning i stället för att svara på frågan: Du kommer att spara massor av tid i längden om du slutar använda Array-klassen och börjar använda System.Collections.Generic.List<T> i stället. Om du har kodat C++ så är generics i C# mycket likt templates.

List<T> har en []-operator som är O(1) så prestanda är oftast inga problem (den implementeras internt med en Array<T>). Den har även AddRange()-metoden för att slå ihop två listor, precis det du vill, och du får mycket inbyggt framework-stöd för sortering etc. Jag använder i princip bara Array-klassen när jag behöver hantera bytes.

Tack! Det blev faktiskt så att jag använde list. Jag har inte programmerat sen, ja 2004 och då var det Arrayer som var det som gällde lixom, visste inte att list fanns ens

WS1: | Asus VI Hero | i7 4770K | 16gb Corsair Vengence | Asus RX 470 Strix | Corsair AX650 | Jonsbo UMX4 | Corsair H100 | SRVR: | Asus E35M1-I | 4gb | FD Array |Laptop: | HP 8440p | I7-620 | 4gb | NVS-3100 | 14" |

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Nov 2013

Många med kortlekar på detta ställe.

var cardTypes = new[] {"H", "R", "K", "S"};
var deckOfCards = cardTypes.SelectMany(c =>
Enumerable.Range(1, 13)
.Select(i => new {Name = string.Format("{0}{1}", c, i), Value = i}))
.OrderBy(o => Guid.NewGuid()).ToList();

GL HF

INTEL CORE I7 5960X 3 GHZ 20MB S-2011-3 @ 4.5G, ASUS RAMPAGE V EXTREME, CORSAIR 16GB DDR4 DOMINATOR 3000MHZ, CORSAIR 850W, Asus GTX980ti OC, FRACTAL DESIGN R4 | Astro gaming A50