2009-11-24 74 views
31

如果我有一個12個元素的數組,並且我想要一個新的數組與第一個和第12個元素。例如,如果我的數組是這樣的:在C#中的數組的子集#

__ __ __ __ __ __ __ __ __ __ __ __ 
a b c d e f g h i j k l 
__ __ __ __ __ __ __ __ __ __ __ __ 

我想要麼改變,或創建一個新的數組,看起來像

__ __ __ __ __ __ __ __ __ __ 

b c d e f g h i j k 
__ __ __ __ __ __ __ __ __ __ 

我知道我可以通過遍歷他們做到這一點。我只是想知道是否有一個更清潔的方式內置到C#中。

**更新爲修復TYPO。將10個元素更改爲12個元素。

+0

雖然不是「j」數組中的第10個元素嗎?或者你的意思是第一個和最後一個元素? – 2009-11-24 20:07:58

回答

66

LINQ是你的朋友。 :)

var newArray = oldArray.Skip(1).Take(oldArray.Length - 2).ToArray(); 

有點比手動創建陣列並遍歷它當然效率較低,但遠簡單...

使用Array.Copy略微lengithier方法如下。

var newArray = new int[newArray.Count - 2]; 
Array.Copy(oldArray, 1, newArray, 0, newArray.Length); 
+0

我真的很喜歡你的原始答案。 LINQ一直是我的朋友。我從來沒有用過跳過和拿走。謝謝。 – LJM 2009-11-24 19:54:17

+0

@ L. Moser:沒問題 - 也改回來了。 :)是的,我想我每週都會發現一種新的有用的LINQ方法。 – Noldorin 2009-11-24 20:05:13

+3

雖然Linq很方便,但性能卻差得多 – Mario 2014-05-12 17:05:39

5

你可以用Array.Copy或LINQ來做到這一點。

var letters = string[] { "a", "b", "c", "d", "e", "f", "g", "h", "i" }; 

int length = letters.Length - 2; 
var items = new string[length]; 
Array.Copy(letters, 1, items, 0, length); 
// or 
var items = letters.Skip(1).Take(length).ToArray(); 
1
string[] s = initialize the array... 

var subset = s.Skip(1).Take(s.Length - 2).ToArray(); 
+0

有趣的解決方案 – JohnIdol 2009-11-24 19:50:57

2

Array.Copy()會爲你做的,但你還是要創建您擁有正確的尺寸新的數組。

30

的LINQ是所有漂亮和時髦的,但如果你正在尋找一個1班輪你可以只編寫自己的效用函數:

static class ArrayUtilities 
{ 
    // create a subset from a range of indices 
    public static T[] RangeSubset<T>(this T[] array, int startIndex, int length) 
    { 
     T[] subset = new T[length]; 
     Array.Copy(array, startIndex, subset, 0, length); 
     return subset; 
    } 

    // create a subset from a specific list of indices 
    public static T[] Subset<T>(this T[] array, params int[] indices) 
    { 
     T[] subset = new T[indices.Length]; 
     for (int i = 0; i < indices.Length; i++) 
     { 
      subset[i] = array[indices[i]]; 
     } 
     return subset; 
    } 
} 

,那麼你可以做到以下幾點:

 char[] original = new char[] { 'a', 'b', 'c', 'd', 'e', 'f', 'g' }; 

     // array containing 'b' - 'f' 
     char[] rangeSubset = original.RangeSubset(1, original.Length - 2); 

     // array containing 'c', 'd', and 'f' 
     char[] specificSubset = original.Subset(2, 3, 5); 
+2

我非常喜歡這個解決方案。 – 2009-11-24 22:25:02

0

如果你想避免手動索引數組。不要試圖拉的要求,雖然在任何地方:

var newArray = oldArray.Skip(1).Reverse().Skip(1).Reverse().ToArray() 
+0

這看起來不會丟棄最後一個元素。 – 2015-05-29 02:24:21

+0

感謝@NathanTuggy,忘記了這一點。 – Tobias 2015-05-29 20:43:02

2

您可以使用ArraySegment<T>結構如下圖所示:這裏

var arr = new[] { 1, 2, 3, 4, 5 }; 
var offset = 1; 
var count = 2; 
var subset = new ArraySegment<int>(arr, offset, count) 
      .ToArray(); // output: { 2, 3 } 

檢查的extension method,使得利用它更容易。