2016-03-19 17 views
3

olarak ayarlayın. Bir dizide belirli aralık için belirli değerler nasıl ayarlanacağını bir yol arıyordum. BuBelirli bir aralık için dizi değerlerini C#

Pseudocode gibi

şey:

var s = new uinit[64]; 
s[ 0..15] := { 2, 4, 6, 3, 1, 7, 8, 9, 7, 11, 37, 32, 19, 16, 178, 2200 } 
s[16..31] := ... 

C# böyle bir şey bulmaya çalışıyorum, ama hiç şansım oldu. Böyle bir şey ile gelip çalışıyorum: Ben bulabildim

public void SetArrayValues(int startIndex, uint[] values) 
{ 
    var length = values.Length; 
    this.array[startIndex, startIndex + length] = values; 
} 

tek şey System.Array.SetValue ama bu benim gereksinimlerini karşılamıyor.

Bir şey mi eksik?

peşin

+3

Kullanım Liste AddRange() ve bir dizi dönüştürmek. Örneğinizden – vortex

+0

bir dizi aradığınız gibi değil, sıralı parçalar dizisini doldurmak için bir yol için, ve bu çok daha kolay olduğunu düşünüyorum. @vortex bunun için doğru yolu önerdi –

+0

Olası kopyası [Bir dizinin bir kısmını C# içindeki başka bir diziye nasıl kopyalarız?] (http://stackoverflow.com/questions/733243/how-to-copy-part-of-an -array-için-bir-dizi-içinde-c) –

cevap

10

ben yapabileceğiniz en yakın Array.Copy aracılığıyla olduğunu düşünüyorum:

var s = new uint[64]; 
uint[] values = { 2, 4, 6, 3, 1, 7, 8, 9, 7, 11, 37, 32, 19, 16, 178, 2200 }; 

int sourceIndex = 0; 
int destinationIndex = 0; 
Array.Copy(values, sourceIndex , s, destinationIndex , values.Length); 
0

değil açıklanan yönteme tam bir eşleşme içinde herhangi bir yardım için teşekkürler, ama bir List<int> oluşturup AddRange() yöntemi kullanabilirsiniz. Tüm değerleri ekledikten sonra, bir diziye dönüştürmek için ToArray() yöntemini kullanabilirsiniz.

var numbers = new List<int>(); 
numbers.AddRange(new List<int>{ 2, 4, 6, 3, 1, 7, 8, 9, 7, 11, 37, 32, 19, 16, 178, 2200 }); 
//numbers.AddRange(new List<int> { ... }); 

var asArray = numbers.ToArray(); 
-1

Sen birkaç şekilde yapabiliriz. Gereksinimlerinizi ve kodunuzu bilmediğim için, bunu size uyacak şekilde değiştirmeniz gerektiğini biliyorum. Ancak C# dizileri C++ dizilerinden farklıdır, dolayısıyla dizin her zaman sıfırdan başlar.

UInt64[] list = {2, 4, 6, 3, 1, 7, 8, 9, 7, 11, 37, 32, 19, 16, 178, 2200,..}; 
//Length of the list must be 31. That is contain 31 numbers. 

UInt64[] s= new UInt64[31]; 

// You can have all the collection 

for (int i = 0; i < list.Length; i++) 
{ 
    s[i] = list[i]; 
}  

// Or you can modify as below 

for (int i = 0; i < 15; i++) 
{ 
    s[i] = list[i]; 
} 

for (int i = 16; i < 31; i++) 
{ 
    s[i] = list[i]; 
} 
0

Öncelikle Diziler tanımlamak

s1 := { ... } 
    s2 := { ... } 
    s3 := { ... } 
    ... 
    sn := { ... } 

Sonra sadece bir linq yöntemi zinciri

var result = s1.Concat(s2).Concat(s3)....Concat(sn) bunları Concat;

İstediğiniz sırayla yapabilir ve kesin sonucu alabilirsiniz. Sadece zinciri biraz değiştirerek oluşan diziyi değiştirmek kolaydır.

3

Sen yapmak için bir uzantısı yöntem yazabilirsiniz bu basit: şu şekilde görünecektir onu kullanma

public static class ArrayExt 
{ 
    public static T[] Set<T>(this T[] self, int index, params T[] values) 
    { 
     Array.Copy(values, 0, self, index, values.Length); 
     return self; 
    } 
} 

:

var s = new uint[64]; 
s.Set<uint>(0, 2, 4, 6, 3, 1, 7, 8, 9, 7, 11, 37, 32, 19, 16, 178, 2200); 

Set() Çünkü döner dizisi, ayrıca böyle aramaları zincir edebilirsiniz:

s.Set<uint>(0, 2, 4, 6, 3, 1, 7, 8, 9, 7, 11, 37, 32, 19, 16, 178, 2200) 
.Set<uint>(16, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); 

Not: Açıkçası c hepsi, int s değerini değerler listesinden kullandığımız gerçeğinden kaynaklanmaktadır.

hedef uint olduğundan gerçekten uint kullanmalıdır ardından türünü belirtmek için gerek yoktur:

var s = new uint[64]; 
s.Set(0, 2u, 4u, 6u, 3u, 1u, 7u, 8u, 9u, 7u, 11u, 37u, 32u, 19u, 16u, 178u, 2200u); 

Ve tabii ki mesela her türlü ile çalışır string:

var x = new string[64]; 
x.Set(10, "A", "B", "C"); 
İlgili konular