C# Slå ihop olika antal arrayer till en stor

Permalänk

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

Visa signatur

WS1: | Gigabyte X670 G AX | Ryzen 9 7950x3D | 32GB G.Skill Trident Z5 NeoRGB | Sapphire RX 7800XT Pure | Corsair RM650i | Lian-Li O11 | EK Nucleus CR360 | WS2: | Asus RoG Strix X470-F | Ryzen 7 5600x | 16gb G.skill Trident Z Neo 3600mhz | Asus RoG Strix 3070 | Lian-Li Lancool 205 | ESX Srvr1 | MSI B450-A Pro Max | Ryzen 7 3700x | 64GB Corsair Vengence | Jonsbo UMX4 | Srvr2 MacMini | ClearOS

Permalänk
Medlem

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

Visa signatur

[IT-Dept]
Ryzen 1700 OC - 32 - 1070

Permalänk
Medlem

@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.

Permalänk

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

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

Visa signatur

WS1: | Gigabyte X670 G AX | Ryzen 9 7950x3D | 32GB G.Skill Trident Z5 NeoRGB | Sapphire RX 7800XT Pure | Corsair RM650i | Lian-Li O11 | EK Nucleus CR360 | WS2: | Asus RoG Strix X470-F | Ryzen 7 5600x | 16gb G.skill Trident Z Neo 3600mhz | Asus RoG Strix 3070 | Lian-Li Lancool 205 | ESX Srvr1 | MSI B450-A Pro Max | Ryzen 7 3700x | 64GB Corsair Vengence | Jonsbo UMX4 | Srvr2 MacMini | ClearOS

Permalänk
Medlem

@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.

Permalänk
Medlem

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();

Visa signatur

Still play with birds like I hang with mother goose.

Permalänk
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

Visa signatur

WS1: | Gigabyte X670 G AX | Ryzen 9 7950x3D | 32GB G.Skill Trident Z5 NeoRGB | Sapphire RX 7800XT Pure | Corsair RM650i | Lian-Li O11 | EK Nucleus CR360 | WS2: | Asus RoG Strix X470-F | Ryzen 7 5600x | 16gb G.skill Trident Z Neo 3600mhz | Asus RoG Strix 3070 | Lian-Li Lancool 205 | ESX Srvr1 | MSI B450-A Pro Max | Ryzen 7 3700x | 64GB Corsair Vengence | Jonsbo UMX4 | Srvr2 MacMini | ClearOS

Permalänk
Medlem

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

Visa signatur

INTEL CORE I7 5960X 3 GHZ 20MB S-2011-3 @ 4.2ghz, ASUS RAMPAGE V EXTREME, CORSAIR 32GB DDR4 DOMINATOR 3000MHZ, CORSAIR 850W, Asus RTX 2080ti OC, FRACTAL DESIGN R4