Αντικατάσταση για ... εάν σειρά επανάληψης

ψήφοι
7

Λατρεύω Η κατανόηση κατάλογος Python, επειδή συνοπτικά αντιπροσωπεύουν ένα μετασχηματισμό μιας λίστας.

Ωστόσο, σε άλλες γλώσσες, που συχνά τον εαυτό μου γράφοντας κάτι προς την κατεύθυνση της:

foreach (int x in intArray)
  if (x > 3) //generic condition on x
    x++ 
    //do other processing

Αυτό το παράδειγμα είναι σε C #, όπου είμαι κάτω από την εντύπωση LINQ μπορεί να βοηθήσει με αυτό, αλλά υπάρχει κάποια κοινή δομή προγραμματισμού που μπορεί να αντικαταστήσει αυτό το ελαφρώς λιγότερο-από-κομψή λύση; Ίσως μια δομή δεδομένων που δεν είμαι θεωρώντας;

Δημοσιεύθηκε 16/08/2008 στις 23:28
πηγή χρήστη
Σε άλλες γλώσσες...                            


6 απαντήσεις

ψήφοι
-1

Εξαρτάται από τη γλώσσα και τι πρέπει να κάνουμε, ένα «χάρτη», όπως λέγεται σε πολλές γλώσσες θα μπορούσε να είναι αυτό που ψάχνετε. Δεν ξέρω C #, αλλά σύμφωνα με αυτή τη σελίδα, .NET 2.0 κλήσεις χάρτη «ConvertAll».

Η έννοια του «χάρτη» είναι πολύ απλή - να λάβει μια λίστα, και να εφαρμόσει μια λειτουργία σε κάθε στοιχείο του, επιστρέφοντας μια νέα λίστα. Μπορεί επίσης να ψάχνετε για «φίλτρο», το οποίο θα σας δώσει μια λίστα με τα στοιχεία που ικανοποιούν ένα κατηγόρημα σε μια άλλη λίστα.

Απαντήθηκε 16/08/2008 στις 23:37
πηγή χρήστη

ψήφοι
0

σε Ruby:

intArray.select { |x| x > 3 }.each do |x|
  # do other processing
end

ή αν «άλλη επεξεργασία» είναι μια μικρή one-επένδυση:

intArray.select { |x| x > 3 }.each { |x| something_that_uses x }

Τέλος, αν θέλετε να επιστρέψετε ένα νέο πίνακα που περιέχει τα αποτελέσματα της επεξεργασίας των στοιχείων αυτών είναι μεγαλύτερη από 3:

intArray.select { |x| x > 3 }.map { |x| do_something_to x }
Απαντήθηκε 16/08/2008 στις 23:47
πηγή χρήστη

ψήφοι
1

Στην Python, έχετε το φίλτρο και το χάρτη , η οποία μπορεί έτσι ό, τι θέλετε:

map(lambda x: foo(x + 1) filter(lambda x: x > 3, intArray))

Υπάρχει επίσης κατάλογος Η κατανόηση που μπορεί να κάνει και τα δύο σε ένα εύκολο δήλωση:

[f(x + 1) for x in intArray if x > 3]
Απαντήθηκε 16/08/2008 στις 23:56
πηγή χρήστη

ψήφοι
2

Στην C # μπορείτε να εφαρμόσετε την επιλεκτική επεξεργασία για κάτι που ζει μέσα σε ένα IEnumerable όπως αυτό:

intArray.Where(i => i > 3).ConvertAll();
DoStuff(intArray.Where(i => i 3));

Και τα λοιπα..

Απαντήθηκε 17/08/2008 στις 00:06
πηγή χρήστη

ψήφοι
5

Η αύξηση στο αρχικό foreachβρόχο δεν θα επηρεάσει το περιεχόμενο του πίνακα, ο μόνος τρόπος για να γίνει αυτό παραμένει ένα forβρόχο:

for(int i = 0; i < intArray.Length; ++i)
{
    if(intArray[i] > 3) ++intArray[i];
}

LINQ δεν έχει σκοπό να τροποποιήσει υπάρχουσες συλλογές ή ακολουθίες. Δημιουργεί νέες σειρές με βάση τις ήδη υπάρχουσες. Είναι δυνατόν να επιτευχθεί ο παραπάνω κώδικα χρησιμοποιώντας Linq, αν και είναι ελαφρά έναντι του σκοπούς:

var newArray1 = from i in intArray select ((i > 3) ? (i + 1) : (i));
var newArray2 = intArray.Select(i => (i > 3) ? (i + 1) : (i));

Χρησιμοποιώντας where(ή ισοδύναμο), όπως παρουσιάζεται σε ορισμένα από τα άλλες απαντήσεις, να αποκλείει τα όποια τιμές μικρότερες από ή ίσες με 3 από την προκύπτουσα αλληλουχία.

var intArray = new int[] { 10, 1, 20, 2 };
var newArray = from i in intArray where i > 3 select i + 1;
// newArray == { 11, 21 }

Υπάρχει μια ForEachμέθοδος για πίνακες που θα σας επιτρέψει να χρησιμοποιήσετε μια λειτουργία λάμδα αντί για ένα foreachμπλοκ, αν και για τίποτα περισσότερο από μια κλήση μεθόδου θα κολλήσει με foreach.

intArray.ForEach(i => DoSomething(i));
Απαντήθηκε 17/08/2008 στις 01:44
πηγή χρήστη

ψήφοι
0
map(lambda x: test(x + 1) filter(lambda x: x > 3, arr))
Απαντήθηκε 25/06/2011 στις 12:28
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more