2011-04-15 4 views
0

J'ai un tableau de int sObtenez un index de tableau et supprimer tout ce qui reste de cet indice

int[] RowOfints = 1,2,3,4,5,6,7,8,9; 

si j'entre par exemple la valeur 4 je veux supprimer 1,2,3 du tableau et retourner ce qui reste. Comment faire cela?

+0

Pourquoi vous retirez 1,2,3 en raison de la valeur 4? Est-ce leur valeur ou leur position? –

+0

@Jeffrey je ne pense pas que cela fait vraiment la différence quand il a un tableau séquentiel, monsieur. – Bastardo

+0

@EmreVeriyaz - Vrai, mais la séquence du tableau est-elle invariante ou n'est-ce qu'un exemple? Si c'est toujours une liste séquentielle, alors il n'y a pas vraiment de bonne raison de le stocker dans un tableau pour commencer! –

Répondre

1

J'interprétation votre question que vous voulez trouver l'indice de la valeur 4 puis prendre tout à partir de cette position d'index.

var result = RowOfInts.SkipWhile(item => item != 4); // optionally, .ToArray() 

result sera un IEnumerable<int> composé de 4 .. 9. Si vous voulez un tableau concret, vous pouvez également utiliser la méthode d'extension ToArray() optionnelle. Si aucun élément du tableau ne correspond aux critères donnés, vous obtiendrez une séquence de longueur nulle.

+0

@Anthony Pegram Cela fera l'affaire.1 question de plus, puis-je faire la sélection des nombres Par exemple de ce tableau à valeurs de displa seulement entre 4 et 7 – Michael27

+0

@Michael, cela ressemble à un filtre 'Where'. 'RowOfInts.Where (item => item> = 4 && item <= 7);' Cela retournerait tout ce qui répond à ce critère indépendamment de sa position dans la séquence d'origine. Vous pouvez également chaîner ces méthodes pour filtrer, regrouper, ordonner et/ou projeter vos données de plusieurs façons. Sur la base de vos questions, vous pouvez voir qu'il y avait beaucoup d'interprétations de ce que vous vouliez réellement! –

+0

@Anthony cela ne supprime rien droit, monsieur? – Bastardo

2

Utilisation de l'extension Skip dans LINQ.

int[] newArray = RowOfInts.Skip(value).ToArray(); 
+0

Sauter (2) saute les 2 premiers éléments en séquence. Ce n'est pas ce que OP a demandé. Hmm, ou, c'est. Cela dépend de l'interprétation. –

+0

Il a juste besoin d'ignorer 'value - 1'. – Homam

-1

en utilisant System.Linq; ....

int[] RowOfints = {1,2,3,4,5,6,7,8,9}; 
int[] Answer = RowOfints.Where(x => x != 1 && x != 2 && x != 3).ToArray() 
+1

Et si le tableau avait 1000 éléments dans la séquence et l'index demandé était 998? –

+0

Je ne suis pas le downvoter, mais l'OP a spécifié que "4" faisait aussi partie de l'entrée, et il devrait être utilisé d'une manière ou d'une autre. Vous devriez essayer de le presser quelque part. –

+0

Ups, mon mauvais. J'ai mal lu la question. –

3

Si vous ne souhaitez pas utiliser LINQ:

int[] newRowOfInts = new int[RowOfInts.Length - index]; 
Array.Copy(RowOfInts, index, newRowOfInts, 0, newRowOfInts.Length); 
1

OK, maintenant que je comprends la question mieux, je vais poster ma version des besoins réels (encore une fois en mettant l'accent perversement effeciency sur la lisibilité):

private static int[] RemoveBeforeValue(int[] source, int value) 
{ 
    if (source == null) 
     return null; 
    int valueIndex = 0; 
    while (valueIndex < source.Length && source[valueIndex] != value) 
     valueIndex++; 
    if (valueIndex == 0) 
     return source; 
    int[] result = new int[source.Length - valueIndex]; 
    Array.Copy(source, valueIndex, result, 0, result.Length); 
    return result; 
} 

RÉPONSE VIEUX

Si vous voulez pour le faire dur (mais efficace!) façon, alors vous pouvez le faire (en supposant que vous voulez supprimer les valeurs inférieures à la valeur fournie):

private static int[] RemoveValuesLessThan(int[] source, int newMinimum) 
{ 
    if (source == null) 
     return null; 
    int lessThanCount = 0; 
    for (int index = 0; index < source.Length; index++) 
     if (source[index] < newMinimum) 
      lessThanCount++; 
    if (lessThanCount == 0) 
     return source; 
    int[] result = new int[source.Length - lessThanCount]; 
    int targetIndex = 0; 
    for (int index = 0; index < source.Length; index++) 
     if (source[index] >= newMinimum) 
      result[targetIndex++] = source[index]; 
    return result; 
} 
+0

Cela fait beaucoup de code pour ce qui est de 'source.Where (item => item> = newMinimum) .ToArray()' n'est-ce pas? –

+0

@Anthony Pegram - Il y a beaucoup de code source, mais ça fait * beaucoup moins que votre version. Oui, le tien est probablement meilleur, mais j'aime micro-optimiser tout à mort. –

+0

@Anthony Pegram - C'est marrant que personne n'ait encore posté votre version LINQ comme réponse. Je pensais vraiment que mon interprétation de la question était la plus probable, et votre code est la mise en œuvre la plus évidente de la réponse. –

0

output
Pour un tableau séquentiel de ints

public static void RemoveIntsBefore(int i) 
    { 
     int[] RowOfints = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 

     for (int k = 0; k < RowOfints.Length; k++) 
     { 
      if (RowOfints.ElementAt(k) < i) 
      { 
       RowOfints[k] = i; 
      } 
     } 

     RowOfints = RowOfints.Distinct().ToArray(); 
//this part is to write it on console 
      //foreach (var item in RowOfints) 
      //{ 
      // Console.WriteLine(item); 
      //} 

      //Console.ReadLine(); 

    } 

avec celui-ci votre tableau ne doit pas être séquentielle

public static void RemoveIntsBefore(int i) 
    { 
     int[] RowOfints = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 1,2 };      

     Console.WriteLine("OUTPUT"); 
     foreach (var item in Enumerable.Range(i-1, RowOfints.Length + 1 - i).ToArray()) 
     { 
      Console.WriteLine(RowOfints[item]); 
     } 

     Console.ReadLine(); 

    } 
+0

Votre réponse dit "sans utiliser de tableau temporaire ou LINQ", mais votre code inclut 'Distinct(). ToArray()', tous deux font en effet partie de LINQ! –

+0

@Anthony: D oui je vais supprimer cette phrase – Bastardo

+0

Votre résultat avec une entrée de 4 serait '4 4 4 4 5 6 7 8 9'. Est-ce votre interprétation de ce que la question initiale cherchait? –

Questions connexes