2011-04-15 43 views
0

我有int小號獲取排列的指標,並刪除一切留下了指數

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

一個數組,如果我輸入例如值4我想從數組中刪除1,2,3並返回還剩下些什麼的。 如何做到這一點?

+0

你爲什麼,因爲價值4去除1,2,3?這是他們的價值還是他們的位置? – 2011-04-15 21:04:55

+0

@Jeffrey我不認爲當他有一個順序陣列時,它真的會有所不同,先生。 – Bastardo 2011-04-15 21:10:48

+0

@EmreVeriyaz - 確實,但是數組序列是不變的還是隻是一個例子?如果它總是一個順序列表,那麼即使將它存儲在一個數組中,也沒有真正的理由! – 2011-04-15 21:13:48

回答

1

我解釋,你要查找的索引值4,然後採取一切您的問題從該指數位置開始。

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

result將是一個IEnumerable<int>包括4 .. 9。如果你想要一個具體的數組,你也可以使用可選的ToArray()擴展方法。如果數組中沒有元素符合給定條件,您將得到一個零長度序列。

+0

@Anthony Pegram這會做。還有1個問題,我可以選擇數字 例如,該數組只能顯示4到7之間的數值 – Michael27 2011-04-15 21:27:51

+0

@Michael,這聽起來像是一個Where過濾器。 'RowOfInts.Where(item => item> = 4 && item <= 7);'這將返回符合條件的任何東西,而不管它在原始序列中的位置。您還可以鏈接這些方法,以多種方式過濾,分組,排序和/或投影您的數據。根據你的問題措辭,你可以看到有很多關於你真正想要的東西的解釋! – 2011-04-15 21:35:16

+0

@安東尼這不會刪除任何權利,先生? – Bastardo 2011-04-15 21:39:23

2

在LINQ中使用Skip擴展。

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

跳過(2)按順序跳過前2個元素。這不是OP要求的。嗯,或者,它是。取決於解釋。 – 2011-04-15 21:01:54

+0

他只需要跳過'值-1'。 – Homam 2011-04-15 21:09:04

-1

using 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

如果數組中有1,000個項目,請求的索引是998? – 2011-04-15 21:22:41

+0

我不是downvoter,但OP指定「4」也是輸入的一部分,它應該以某種方式或其他方式使用。你應該嘗試在某個地方擠壓它。 – 2011-04-15 21:24:52

+0

Ups,我的壞。我誤解了這個問題。 – 2011-04-16 00:10:22

3

如果你不想使用LINQ:

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

好了,現在我明白這個問題好,我會後我的版本的實際需求(又倔強強調效益分析了可讀性):

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; 
} 

OLD ANSWER

如果你想(但是高效!)的方式,那麼你可以這樣做(假設你想刪除小於提供值的值):

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

這就是很多代碼,它代表了'source.Where(item => item> = newMinimum).ToArray()',是不是? – 2011-04-15 21:13:18

+0

@Anthony Pegram - 它有很多源代碼,但它的行爲*比你的版本低很多。是的,你的情況可能會更好,但我喜歡微觀優化所有東西以致死亡。 – 2011-04-15 21:17:20

+0

@Anthony Pegram - 很有趣,沒有人發佈過你的LINQ版本作爲答案。我真的認爲我對這個問題的解釋是最可能的,而你的代碼是答案最明顯的實現。 – 2011-04-15 21:20:37

0

output
對於整數

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

    } 

與這一個的順序排列你的陣列不必是連續

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

你的答案是「沒有使用任何臨時數組或LINQ」,但你的代碼包括'Distinct()。ToArray()',兩者都確實是LINQ的一部分! – 2011-04-15 21:37:25

+0

@Anthony:D是的,我將刪除這句話 – Bastardo 2011-04-15 21:40:20

+0

你輸入4的結果是'4 4 4 4 5 6 7 8 9'。這是你對原始問題尋求的解釋嗎? – 2011-04-15 21:42:12