2014-07-20 21 views
20

Mam listę kart zwanych _deck:Jak "wycofać" element z listy?

private List<String> _deck = new List<String> {"2h", "3h", "4h", ... } 

A potem chcę wyjąć kartę z listy i zapisać do zmiennej. Próbuję zrobić:

String p1FirstCard = _deck.RemoveAt(0); 

ale pojawia się błąd "Nie można przekonwertować typu void na ciąg".

Na C# liście jest coś takiego jak push/pop, ale który robi to na "head" lub "start" listy? (Push/pop działa na "ogonie" lub "końcu" listy).

Jeśli nie, jak mam usunąć pierwszy element, ale zapisać go w zmiennej?

+0

dlaczego nie można używać kolejki zamiast? –

+1

Wygląda na to, że twoja lista kart nazywa się "_deck". – lockstock

Odpowiedz

21

Można to zrobić w dwóch etapach:

String p1FirstCard = _deck[0]; 
_deck.RemoveAt(0); 

Można napisać własne metody rozszerzenie pomocnika (I dodaje indeksu do Pop, jak @Fredou zasugerował:

static class ListExtension 
{ 
    public static T PopAt<T>(this List<T> list, int index) 
    { 
     T r = list[index]; 
     list.RemoveAt(index); 
     return r; 
    } 
} 

a następnie zadzwonić

String p1FirstCard = _deck.PopAt(0); 

PS Nazwa może być nieco mylące.Pop zwykle usuwa ostatni element, nie pierwszy.

+0

Może powinieneś zmienić swój kod, aby użyć parametru do zwrócenia/usunięcia elementu według indeksu, który dałby wszystkim możliwość wyboru OP – Fredou

+0

Nice. W przypadku tasowania tali nie ma znaczenia, czy wyciągnę z góry czy z dołu talii, więc jest to niesamowite. dzięki. –

23

można po prostu użyć Queue class, że C# już masz?

class Program 
{ 
    static void Main(string[] args) 
    { 
     var _deck = new Queue<String>(); 
     _deck.Enqueue("2h"); 
     _deck.Enqueue("3h"); 
     _deck.Enqueue("4h"); 
     _deck.Enqueue("..."); 

     var first = _deck.Dequeue(); // 2h 
     first = _deck.Dequeue(); // 3h 
    } 
} 

lub może po prostu użyć Stack class że C# już masz?

class Program 
{ 
    static void Main(string[] args) 
    { 
     var _deck = new Stack<String>(); 
     _deck.Push("2h"); 
     _deck.Push("3h"); 
     _deck.Push("4h"); 
     _deck.Push("..."); 

     var first = _deck.Pop(); // ... 
     first = _deck.Pop(); // 4h 
    } 
} 
+0

@AlexD, poprawione, słowo kluczowe pop sprawia, że ​​myślę o stosie ... – Fredou

+0

Masz na myśli ogólną wersję: msdn.microsoft.com/en-us/library/7977ey2c.aspx – AlexD

+0

Ani stos C#, ani kolejka nie będą usuwane * koniec * listy, czyli w jaki sposób actionscript ['pop()'] (http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/Array.html#pop%28%29) Prace. Nie oznacza to, że nie są właściwym wyborem, tylko że żaden z nich nie jest idealnie dopasowany. – Bobson

3

Jeśli chcesz bezpośredni odpowiednik pop(), musisz napisać własną rękę, bo nie sądzę, żeby coś w C# automatycznie ma „Usuń z końca iz powrotem”. Są jednak dostępne zarówno klasy Queue (pierwsze weszło, pierwsze wyszło), jak i klasy Stack (pierwsze na wejściu, ostatnie wyjście), a nie tylko List.

Jest też klasa LinkedList który pozwala dodać lub usunąć zarówno na początku lub na końcu, ale przewidziane RemoveFirst() i RemoveLast() metody nie automatycznie powrócić element jest usuwany - trzeba by napisać metodę rozszerzenia jak AlexD's, aby to zrobić.

Wszystko to dotyczy usuwania elementów z początku lub na końcu listy. Jeśli chcesz usunąć dowolny element ze środka modelu List, zawsze jest List.Remove(item), który usuwa konkretny element z listy (a nie według pozycji).

0
private List<String> _deck = new List<String> {"2h", "3h", "4h", ... } 
//Save into variable first 
String p1FirstCard = _deck[0]; 
//Now just remove it 
_deck.RemoveAt(0); 

RemoveAt() nic nie zwraca.

2

Opierając się na odpowiedź AlexD za dodałem jeszcze kilka metod rozszerzeń:

public static class ListExtensionMethods 
{ 
    public static T PopAt<T>(this List<T> list, int index) 
    { 
     var r = list[index]; 
     list.RemoveAt(index); 
     return r; 
    } 

    public static T PopFirst<T>(this List<T> list, Predicate<T> predicate) 
    { 
     var index = list.FindIndex(predicate); 
     var r = list[index]; 
     list.RemoveAt(index); 
     return r; 
    } 

    public static T PopFirstOrDefault<T>(this List<T> list, Predicate<T> predicate) where T : class 
    { 
     var index = list.FindIndex(predicate); 
     if (index > -1) 
     { 
      var r = list[index]; 
      list.RemoveAt(index); 
      return r; 
     } 
     return null; 
    } 
}