[C#] 단일 값으로 C # 배열을 채우거나 인스턴스화하는 방법은 무엇입니까?

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