C #에서 인스턴스화 된 값 유형의 배열은 유형의 기본값 으로 자동으로 채워진다는 것을 알고 있습니다 (예 : bool의 경우 false, int의 경우 0 등).
기본값이 아닌 시드 값으로 배열을 자동으로 채우는 방법이 있습니까? 나중에 Java의 Arrays.fill () 과 같은 생성 또는 내장 메소드가 있습니까? 기본적으로 false 대신 부울 배열을 원한다고 가정 해보십시오. 이 작업을 수행하는 기본 제공 방법이 있습니까, 아니면 for 루프를 사용하여 배열을 반복해야합니까?
// Example pseudo-code:
bool[] abValues = new[1000000];
Array.Populate(abValues, true);
// Currently how I'm handling this:
bool[] abValues = new[1000000];
for (int i = 0; i < 1000000; i++)
{
abValues[i] = true;
}
배열을 반복하고 각 값을 true로 “재설정”하는 것은 비효율적입니다. 어쨌든 주위에 있습니까? 어쩌면 모든 가치를 뒤집어서?
이 질문을 입력하고 그것에 대해 생각한 후에, 기본값은 C #이 장면 뒤에서 이러한 객체의 메모리 할당을 처리하는 방법의 결과 일 뿐이라고 생각합니다. 그러나 나는 아직도 확실하게 알고 싶다!
답변
프레임 워크 방법을 모르지만 빠른 도우미를 작성하면됩니다.
public static void Populate<T>(this T[] arr, T value ) {
for ( int i = 0; i < arr.Length;i++ ) {
arr[i] = value;
}
}
답변
Enumerable.Repeat(true, 1000000).ToArray();
답변
천 개의 true
값 으로 새 배열을 만듭니다 .
var items = Enumerable.Repeat<bool>(true, 1000).ToArray(); // Or ToList(), etc.
마찬가지로 정수 시퀀스를 생성 할 수 있습니다.
var items = Enumerable.Range(0, 1000).ToArray(); // 0..999
답변
가변 크기의 대형 배열 또는 배열의 경우 다음을 사용해야합니다.
Enumerable.Repeat(true, 1000000).ToArray();
작은 배열의 경우 C # 3의 컬렉션 초기화 구문을 사용할 수 있습니다.
bool[] vals = new bool[]{ false, false, false, false, false, false, false };
컬렉션 초기화 구문의 장점은 각 슬롯에서 동일한 값을 사용할 필요가 없으며 표현식 또는 함수를 사용하여 슬롯을 초기화 할 수 있다는 것입니다. 또한 배열 슬롯을 기본값으로 초기화하는 비용을 피한다고 생각합니다. 예를 들어,
bool[] vals = new bool[]{ false, true, false, !(a ||b) && c, SomeBoolMethod() };
답변
배열이 너무 큰 경우 BitArray를 사용해야합니다. 부울 배열과 같이 바이트 대신 모든 부울에 1 비트를 사용하며 비트 연산자로 모든 비트를 true로 설정할 수 있습니다. 또는 그냥 true로 초기화하십시오. 한 번만 수행하면 비용이 더 많이 듭니다.
System.Collections.BitArray falses = new System.Collections.BitArray(100000, false);
System.Collections.BitArray trues = new System.Collections.BitArray(100000, true);
// Now both contain only true values.
falses.And(trues);
답변
Array.Fill
.NET Core 2.0 이상 및 .NET Standard 2.1 이상에서 사용할 수 있습니다 .
답변
불행히도 직접적인 방법은 없다고 생각하지만 배열 클래스의 확장 메소드를 작성하여이를 수행 할 수 있다고 생각합니다.
class Program
{
static void Main(string[] args)
{
int[] arr = new int[1000];
arr.Init(10);
Array.ForEach(arr, Console.WriteLine);
}
}
public static class ArrayExtensions
{
public static void Init<T>(this T[] array, T defaultVaue)
{
if (array == null)
return;
for (int i = 0; i < array.Length; i++)
{
array[i] = defaultVaue;
}
}
}