ArraySegment<T> 構造体
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
1 次元配列のセクションを区切ります。
generic <typename T>
public value class ArraySegment : System::Collections::Generic::ICollection<T>, System::Collections::Generic::IEnumerable<T>, System::Collections::Generic::IList<T>, System::Collections::Generic::IReadOnlyCollection<T>, System::Collections::Generic::IReadOnlyList<T>
generic <typename T>
public value class ArraySegment
public struct ArraySegment<T> : System.Collections.Generic.ICollection<T>, System.Collections.Generic.IEnumerable<T>, System.Collections.Generic.IList<T>, System.Collections.Generic.IReadOnlyCollection<T>, System.Collections.Generic.IReadOnlyList<T>
public readonly struct ArraySegment<T> : System.Collections.Generic.ICollection<T>, System.Collections.Generic.IEnumerable<T>, System.Collections.Generic.IList<T>, System.Collections.Generic.IReadOnlyCollection<T>, System.Collections.Generic.IReadOnlyList<T>
[System.Serializable]
public struct ArraySegment<T>
[System.Serializable]
public struct ArraySegment<T> : System.Collections.Generic.ICollection<T>, System.Collections.Generic.IEnumerable<T>, System.Collections.Generic.IList<T>, System.Collections.Generic.IReadOnlyCollection<T>, System.Collections.Generic.IReadOnlyList<T>
type ArraySegment<'T> = struct
interface ICollection<'T>
interface seq<'T>
interface IEnumerable
interface IList<'T>
interface IReadOnlyCollection<'T>
interface IReadOnlyList<'T>
[<System.Serializable>]
type ArraySegment<'T> = struct
[<System.Serializable>]
type ArraySegment<'T> = struct
interface IList<'T>
interface ICollection<'T>
interface IReadOnlyList<'T>
interface IReadOnlyCollection<'T>
interface seq<'T>
interface IEnumerable
[<System.Serializable>]
type ArraySegment<'T> = struct
interface IList<'T>
interface ICollection<'T>
interface seq<'T>
interface IEnumerable
interface IReadOnlyList<'T>
interface IReadOnlyCollection<'T>
type ArraySegment<'T> = struct
interface IList<'T>
interface ICollection<'T>
interface IReadOnlyList<'T>
interface IReadOnlyCollection<'T>
interface seq<'T>
interface IEnumerable
Public Structure ArraySegment(Of T)
Implements ICollection(Of T), IEnumerable(Of T), IList(Of T), IReadOnlyCollection(Of T), IReadOnlyList(Of T)
Public Structure ArraySegment(Of T)
型パラメーター
- T
配列セグメント内の要素の型。
- 継承
- 属性
- 実装
例
次のコード例では、ArraySegment<T> 構造体をメソッドに渡します。
using namespace System;
namespace Sample
{
public ref class SampleArray
{
public:
static void Work()
{
// Create and initialize a new string array.
array <String^>^ words = {"The", "quick", "brown",
"fox", "jumps", "over", "the", "lazy", "dog"};
// Display the initial contents of the array.
Console::WriteLine("The first array segment"
" (with all the array's elements) contains:");
PrintIndexAndValues(words);
// Define an array segment that contains the entire array.
ArraySegment<String^> segment(words);
// Display the contents of the ArraySegment.
Console::WriteLine("The first array segment"
" (with all the array's elements) contains:");
PrintIndexAndValues(segment);
// Define an array segment that contains the middle five
// values of the array.
ArraySegment<String^> middle(words, 2, 5);
// Display the contents of the ArraySegment.
Console::WriteLine("The second array segment"
" (with the middle five elements) contains:");
PrintIndexAndValues(middle);
// Modify the fourth element of the first array
// segment
segment.Array[3] = "LION";
// Display the contents of the second array segment
// middle. Note that the value of its second element
// also changed.
Console::WriteLine("After the first array segment"
" is modified,the second array segment"
" now contains:");
PrintIndexAndValues(middle);
Console::ReadLine();
}
static void PrintIndexAndValues(ArraySegment<String^>^ segment)
{
for (int i = segment->Offset;
i < (segment->Offset + segment->Count); i++)
{
Console::WriteLine(" [{0}] : {1}", i,
segment->Array[i]);
}
Console::WriteLine();
}
static void PrintIndexAndValues(array<String^>^ words)
{
for (int i = 0; i < words->Length; i++)
{
Console::WriteLine(" [{0}] : {1}", i,
words[i]);
}
Console::WriteLine();
}
};
}
int main()
{
Sample::SampleArray::Work();
return 0;
}
/*
This code produces the following output.
The original array initially contains:
[0] : The
[1] : quick
[2] : brown
[3] : fox
[4] : jumps
[5] : over
[6] : the
[7] : lazy
[8] : dog
The first array segment (with all the array's elements) contains:
[0] : The
[1] : quick
[2] : brown
[3] : fox
[4] : jumps
[5] : over
[6] : the
[7] : lazy
[8] : dog
The second array segment (with the middle five elements) contains:
[2] : brown
[3] : fox
[4] : jumps
[5] : over
[6] : the
After the first array segment is modified, the second array segment now contains:
[2] : brown
[3] : LION
[4] : jumps
[5] : over
[6] : the
*/
using System;
public class SamplesArray {
public static void Main() {
// Create and initialize a new string array.
String[] myArr = { "The", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog" };
// Display the initial contents of the array.
Console.WriteLine( "The original array initially contains:" );
PrintIndexAndValues( myArr );
// Define an array segment that contains the entire array.
ArraySegment<string> myArrSegAll = new ArraySegment<string>( myArr );
// Display the contents of the ArraySegment.
Console.WriteLine( "The first array segment (with all the array's elements) contains:" );
PrintIndexAndValues( myArrSegAll );
// Define an array segment that contains the middle five values of the array.
ArraySegment<string> myArrSegMid = new ArraySegment<string>( myArr, 2, 5 );
// Display the contents of the ArraySegment.
Console.WriteLine( "The second array segment (with the middle five elements) contains:" );
PrintIndexAndValues( myArrSegMid );
// Modify the fourth element of the first array segment myArrSegAll.
myArrSegAll.Array[3] = "LION";
// Display the contents of the second array segment myArrSegMid.
// Note that the value of its second element also changed.
Console.WriteLine( "After the first array segment is modified, the second array segment now contains:" );
PrintIndexAndValues( myArrSegMid );
}
public static void PrintIndexAndValues( ArraySegment<string> arrSeg ) {
for ( int i = arrSeg.Offset; i < (arrSeg.Offset + arrSeg.Count); i++ ) {
Console.WriteLine( " [{0}] : {1}", i, arrSeg.Array[i] );
}
Console.WriteLine();
}
public static void PrintIndexAndValues( String[] myArr ) {
for ( int i = 0; i < myArr.Length; i++ ) {
Console.WriteLine( " [{0}] : {1}", i, myArr[i] );
}
Console.WriteLine();
}
}
/*
This code produces the following output.
The original array initially contains:
[0] : The
[1] : quick
[2] : brown
[3] : fox
[4] : jumps
[5] : over
[6] : the
[7] : lazy
[8] : dog
The first array segment (with all the array's elements) contains:
[0] : The
[1] : quick
[2] : brown
[3] : fox
[4] : jumps
[5] : over
[6] : the
[7] : lazy
[8] : dog
The second array segment (with the middle five elements) contains:
[2] : brown
[3] : fox
[4] : jumps
[5] : over
[6] : the
After the first array segment is modified, the second array segment now contains:
[2] : brown
[3] : LION
[4] : jumps
[5] : over
[6] : the
*/
open System
// Print functions.
let printIndexAndValues (myArr: string []) =
for i = 0 to myArr.Length - 1 do
printfn $" [{i}] : {myArr[i]}"
printfn ""
let printIndexAndValuesSeg (arrSeg: ArraySegment<string>) =
for i = arrSeg.Offset to arrSeg.Offset + arrSeg.Count - 1 do
printfn $" [{i}] : {arrSeg.Array[i]}"
printfn ""
// Create and initialize a new string array.
let myArr = [| "The"; "quick"; "brown"; "fox"; "jumps"; "over"; "the"; "lazy"; "dog" |]
// Display the initial contents of the array.
printfn "The original array initially contains:"
printIndexAndValues myArr
// Define an array segment that contains the entire array.
let myArrSegAll = ArraySegment<string>(myArr)
// Display the contents of the ArraySegment.
printfn "The first array segment (with all the array's elements) contains:"
printIndexAndValuesSeg myArrSegAll
// Define an array segment that contains the middle five values of the array.
let myArrSegMid = ArraySegment<string>(myArr, 2, 5)
// Display the contents of the ArraySegment.
printfn "The second array segment (with the middle five elements) contains:"
printIndexAndValuesSeg myArrSegMid
// Modify the fourth element of the first array segment myArrSegAll.
myArrSegAll.Array[3] <- "LION"
// Display the contents of the second array segment myArrSegMid.
// Note that the value of its second element also changed.
printfn "After the first array segment is modified, the second array segment now contains:"
printIndexAndValuesSeg myArrSegMid
(*
This code produces the following output.
The original array initially contains:
[0] : The
[1] : quick
[2] : brown
[3] : fox
[4] : jumps
[5] : over
[6] : the
[7] : lazy
[8] : dog
The first array segment (with all the array's elements) contains:
[0] : The
[1] : quick
[2] : brown
[3] : fox
[4] : jumps
[5] : over
[6] : the
[7] : lazy
[8] : dog
The second array segment (with the middle five elements) contains:
[2] : brown
[3] : fox
[4] : jumps
[5] : over
[6] : the
After the first array segment is modified, the second array segment now contains:
[2] : brown
[3] : LION
[4] : jumps
[5] : over
[6] : the
*)
Public Class SamplesArray
Public Shared Sub Main()
' Create and initialize a new string array.
Dim myArr As String() = {"The", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog"}
' Display the initial contents of the array.
Console.WriteLine("The original array initially contains:")
PrintIndexAndValues(myArr)
' Define an array segment that contains the entire array.
Dim myArrSegAll As New ArraySegment(Of String)(myArr)
' Display the contents of the ArraySegment.
Console.WriteLine("The first array segment (with all the array's elements) contains:")
PrintIndexAndValues(myArrSegAll)
' Define an array segment that contains the middle five values of the array.
Dim myArrSegMid As New ArraySegment(Of String)(myArr, 2, 5)
' Display the contents of the ArraySegment.
Console.WriteLine("The second array segment (with the middle five elements) contains:")
PrintIndexAndValues(myArrSegMid)
' Modify the fourth element of the first array segment myArrSegAll.
myArrSegAll.Array(3) = "LION"
' Display the contents of the second array segment myArrSegMid.
' Note that the value of its second element also changed.
Console.WriteLine("After the first array segment is modified, the second array segment now contains:")
PrintIndexAndValues(myArrSegMid)
End Sub
Public Shared Sub PrintIndexAndValues(arrSeg As ArraySegment(Of String))
Dim i As Integer
For i = arrSeg.Offset To (arrSeg.Offset + arrSeg.Count - 1)
Console.WriteLine(" [{0}] : {1}", i, arrSeg.Array(i))
Next i
Console.WriteLine()
End Sub
Public Shared Sub PrintIndexAndValues(myArr as String())
Dim i As Integer
For i = 0 To (myArr.Length - 1)
Console.WriteLine(" [{0}] : {1}", i, myArr(i))
Next i
Console.WriteLine()
End Sub
End Class
'This code produces the following output.
'
'The original array initially contains:
' [0] : The
' [1] : quick
' [2] : brown
' [3] : fox
' [4] : jumps
' [5] : over
' [6] : the
' [7] : lazy
' [8] : dog
'
'The first array segment (with all the array's elements) contains:
' [0] : The
' [1] : quick
' [2] : brown
' [3] : fox
' [4] : jumps
' [5] : over
' [6] : the
' [7] : lazy
' [8] : dog
'
'The second array segment (with the middle five elements) contains:
' [2] : brown
' [3] : fox
' [4] : jumps
' [5] : over
' [6] : the
'
'After the first array segment is modified, the second array segment now contains:
' [2] : brown
' [3] : LION
' [4] : jumps
' [5] : over
' [6] : the
注釈
ArraySegment<T> は、その配列内の要素の範囲を区切る配列のラッパーです。 複数の ArraySegment<T> インスタンスは、同じ元の配列を参照でき、重複する可能性があります。 元の配列は 1 次元でなければならず、0 から始まるインデックスが必要です。
手記
ArraySegment<T> は、.NET Framework 4.6 以降の IReadOnlyCollection<T> インターフェイスを実装します。以前のバージョンの .NET Framework では、ArraySegment<T> 構造体はこのインターフェイスを実装していませんでした。
ArraySegment<T> 構造体は、配列の要素が個別のセグメントで操作されるたびに便利です。 例えば:
Copy などの比較的高価なメソッドを呼び出して配列の一部のコピーを渡すのではなく、配列の一部のみを表す ArraySegment<T> オブジェクトをメソッドに渡すことができます。
マルチスレッド アプリでは、ArraySegment<T> 構造体を使用して、各スレッドが配列の一部でのみ動作するようにすることができます。
タスク ベースの非同期操作では、ArraySegment<T> オブジェクトを使用して、各タスクが配列の個別のセグメントで動作することを確認できます。 次の例では、最大 10 個の要素を持つ個々のセグメントに配列を分割します。 セグメント内の各要素に、そのセグメント番号が乗算されます。 結果は、ArraySegment<T> クラスを使用してこの方法で要素を操作すると、基になる配列の値が変更されることを示しています。
using System; using System.Collections.Generic; using System.Threading.Tasks; public class Example { private const int segmentSize = 10; public static async Task Main() { List<Task> tasks = new List<Task>(); // Create array. int[] arr = new int[50]; for (int ctr = 0; ctr <= arr.GetUpperBound(0); ctr++) arr[ctr] = ctr + 1; // Handle array in segments of 10. for (int ctr = 1; ctr <= Math.Ceiling(((double)arr.Length)/segmentSize); ctr++) { int multiplier = ctr; int elements = (multiplier - 1) * 10 + segmentSize > arr.Length ? arr.Length - (multiplier - 1) * 10 : segmentSize; ArraySegment<int> segment = new ArraySegment<int>(arr, (ctr - 1) * 10, elements); tasks.Add(Task.Run( () => { IList<int> list = (IList<int>) segment; for (int index = 0; index < list.Count; index++) list[index] = list[index] * multiplier; } )); } try { await Task.WhenAll(tasks.ToArray()); int elementsShown = 0; foreach (var value in arr) { Console.Write("{0,3} ", value); elementsShown++; if (elementsShown % 18 == 0) Console.WriteLine(); } } catch (AggregateException e) { Console.WriteLine("Errors occurred when working with the array:"); foreach (var inner in e.InnerExceptions) Console.WriteLine("{0}: {1}", inner.GetType().Name, inner.Message); } } } // The example displays the following output: // 1 2 3 4 5 6 7 8 9 10 22 24 26 28 30 32 34 36 // 38 40 63 66 69 72 75 78 81 84 87 90 124 128 132 136 140 144 // 148 152 156 160 205 210 215 220 225 230 235 240 245 250
open System open System.Threading.Tasks // Create array. let arr = Array.init 50 (fun i -> i + 1) // Handle array in segments of 10. let tasks = Array.chunkBySize 10 arr |> Array.mapi (fun m elements -> let mutable segment = ArraySegment<int>(arr, m * 10, elements.Length) task { for i = 0 to segment.Count - 1 do segment[i] <- segment[i] * (m + 1) } :> Task) try Task.WhenAll(tasks).Wait() let mutable i = 0 for value in arr do printf $"{value, 3} " i <- i + 1 if i % 18 = 0 then printfn "" with :? AggregateException as e -> printfn "Errors occurred when working with the array:" for inner in e.InnerExceptions do printfn $"{inner.GetType().Name}: {inner.Message}" // The example displays the following output: // 1 2 3 4 5 6 7 8 9 10 22 24 26 28 30 32 34 36 // 38 40 63 66 69 72 75 78 81 84 87 90 124 128 132 136 140 144 // 148 152 156 160 205 210 215 220 225 230 235 240 245 250
Imports System.Collections.Generic Imports System.Threading.Tasks Module Example Private Const SegmentSize As Integer = 10 Public Sub Main() Dim tasks As New List(Of Task) ' Create array. Dim arr(49) As Integer For ctr As Integer = 0 To arr.GetUpperBound(0) arr(ctr) = ctr + 1 Next ' Handle array in segments of 10. For ctr As Integer = 1 To CInt(Math.Ceiling(arr.Length / segmentSize)) Dim multiplier As Integer = ctr Dim elements As Integer = If((multiplier - 1) * 10 + segmentSize > arr.Length, arr.Length - (multiplier - 1) * 10, segmentSize) Dim segment As New ArraySegment(Of Integer)(arr, (ctr - 1) * 10, elements) tasks.Add(Task.Run( Sub() Dim list As IList(Of Integer) = CType(segment, IList(Of Integer)) For index As Integer = 0 To list.Count - 1 list(index) = list(index) * multiplier Next End Sub )) Next Try Task.WaitAll(tasks.ToArray()) Dim elementsShown As Integer = 0 For Each value In arr Console.Write("{0,3} ", value) elementsShown += 1 If elementsShown Mod 18 = 0 Then Console.WriteLine() Next Catch e As AggregateException Console.WriteLine("Errors occurred when working with the array:") For Each inner As Exception In e.InnerExceptions Console.WriteLine("{0}: {1}", inner.GetType().Name, inner.Message) Next End Try End Sub End Module ' The example displays the following output: ' 1 2 3 4 5 6 7 8 9 10 22 24 26 28 30 32 34 36 ' 38 40 63 66 69 72 75 78 81 84 87 90 124 128 132 136 140 144 ' 148 152 156 160 205 210 215 220 225 230 235 240 245 250
ただし、ArraySegment<T> 構造体を使用して配列を個別のセグメントに分割することはできますが、セグメントが互いに完全に独立しているわけではありません。 Array プロパティは、配列のコピーではなく、元の配列全体を返します。したがって、Array プロパティによって返される配列に加えられた変更は、元の配列に対して行われます。 これが望ましくない場合は、配列の一部を表す ArraySegment<T> オブジェクトではなく、配列のコピーに対して操作を実行する必要があります。
Equals メソッドと等値演算子と等値演算子と不等値演算子は、2 つの ArraySegment<T> オブジェクトを比較するときに参照の等価性をテストします。 2 つの ArraySegment<T> オブジェクトを等しいと見なすには、次のすべての条件を満たす必要があります。
同じ配列を参照します。
配列内の同じインデックスから始めます。
同じ数の要素を持つ。
ArraySegment<T> オブジェクト内のインデックスによって要素を取得する場合は、IList<T> オブジェクトにキャストして取得するか、IList<T>.Item[] プロパティを使用して変更する必要があります。 これは F# では必要ありません。 次の例では、文字列配列のセクションを区切る ArraySegment<T> オブジェクト内の要素を取得します。
using System;
using System.Collections.Generic;
public class Example
{
public static void Main()
{
String[] names = { "Adam", "Bruce", "Charles", "Daniel",
"Ebenezer", "Francis", "Gilbert",
"Henry", "Irving", "John", "Karl",
"Lucian", "Michael" };
var partNames = new ArraySegment<string>(names, 2, 5);
// Cast the ArraySegment object to an IList<string> and enumerate it.
var list = (IList<string>) partNames;
for (int ctr = 0; ctr <= list.Count - 1; ctr++)
Console.WriteLine(list[ctr]);
}
}
// The example displays the following output:
// Charles
// Daniel
// Ebenezer
// Francis
// Gilbert
open System
let names =
[| "Adam"; "Bruce"; "Charles"; "Daniel"
"Ebenezer"; "Francis"; "Gilbert"
"Henry"; "Irving"; "John"; "Karl"
"Lucian"; "Michael" |]
let partNames = ArraySegment<string>(names, 2, 5)
// Enumerate over the ArraySegment object.
for part in partNames do
printfn $"{part}"
// The example displays the following output:
// Charles
// Daniel
// Ebenezer
// Francis
// Gilbert
Imports System.Collections.Generic
Module Example
Public Sub Main()
Dim names() As String = { "Adam", "Bruce", "Charles", "Daniel",
"Ebenezer", "Francis", "Gilbert",
"Henry", "Irving", "John", "Karl",
"Lucian", "Michael" }
Dim partNames As New ArraySegment(Of String)(names, 2, 5)
' Cast the ArraySegment object to an IList<String> and enumerate it.
Dim list = CType(partNames, IList(Of String))
For ctr As Integer = 0 To list.Count - 1
Console.WriteLine(list(ctr))
Next
End Sub
End Module
' The example displays the following output:
' Charles
' Daniel
' Ebenezer
' Francis
' Gilbert
コンストラクター
ArraySegment<T>(T[]) |
指定した配列内のすべての要素を区切る ArraySegment<T> 構造体の新しいインスタンスを初期化します。 |
ArraySegment<T>(T[], Int32, Int32) |
指定した配列内の要素の指定した範囲を区切る ArraySegment<T> 構造体の新しいインスタンスを初期化します。 |
プロパティ
Array |
配列セグメントが区切る要素の範囲を含む元の配列を取得します。 |
Count |
配列セグメントで区切られた範囲内の要素の数を取得します。 |
Empty |
空の配列セグメントを表します。 このフィールドは読み取り専用です。 |
Item[Int32] |
指定したインデックス位置にある要素を取得または設定します。 |
Offset |
元の配列の先頭を基準にして、配列セグメントで区切られた範囲内の最初の要素の位置を取得します。 |
メソッド
CopyTo(ArraySegment<T>) |
このインスタンスの内容を、同じ型 |
CopyTo(T[]) |
このインスタンスの内容を、同じ型 |
CopyTo(T[], Int32) |
このインスタンスの内容を、指定したコピー先インデックスから始まる、同じ型 |
Equals(ArraySegment<T>) |
指定した ArraySegment<T> 構造体が現在のインスタンスと等しいかどうかを判断します。 |
Equals(Object) |
指定したオブジェクトが現在のインスタンスと等しいかどうかを判断します。 |
GetEnumerator() |
配列セグメントを反復処理するために使用できる列挙子を返します。 |
GetHashCode() |
現在のインスタンスのハッシュ コードを返します。 |
Slice(Int32) |
指定したインデックスから始まる現在の配列セグメントからスライスを形成します。 |
Slice(Int32, Int32) |
指定したインデックスから始まる現在の配列セグメントから、指定した長さのスライスを形成します。 |
ToArray() |
この配列セグメントの内容を新しい配列にコピーします。 |
演算子
Equality(ArraySegment<T>, ArraySegment<T>) |
2 つの ArraySegment<T> 構造体が等しいかどうかを示します。 |
Implicit(T[] to ArraySegment<T>) |
|
Inequality(ArraySegment<T>, ArraySegment<T>) |
2 つの ArraySegment<T> 構造体が等しくないかどうかを示します。 |
明示的なインターフェイスの実装
ICollection<T>.Add(T) |
すべてのケースで NotSupportedException 例外をスローします。 |
ICollection<T>.Clear() |
すべてのケースで NotSupportedException 例外をスローします。 |
ICollection<T>.Contains(T) |
配列セグメントに特定の値が含まれているかどうかを判断します。 |
ICollection<T>.CopyTo(T[], Int32) |
配列セグメントの要素を、指定した配列インデックスから配列にコピーします。 |
ICollection<T>.IsReadOnly |
配列セグメントが読み取り専用かどうかを示す値を取得します。 |
ICollection<T>.Remove(T) |
すべてのケースで NotSupportedException 例外をスローします。 |
IEnumerable.GetEnumerator() |
配列セグメントを反復処理する列挙子を返します。 |
IEnumerable<T>.GetEnumerator() |
配列セグメントを反復処理する列挙子を返します。 |
IList<T>.IndexOf(T) |
配列セグメント内の特定の項目のインデックスを決定します。 |
IList<T>.Insert(Int32, T) |
すべてのケースで NotSupportedException 例外をスローします。 |
IList<T>.Item[Int32] |
指定したインデックス位置にある要素を取得または設定します。 |
IList<T>.RemoveAt(Int32) |
すべてのケースで NotSupportedException 例外をスローします。 |
IReadOnlyList<T>.Item[Int32] |
配列セグメントの指定したインデックス位置にある要素を取得します。 |
拡張メソッド
適用対象
こちらもご覧ください
.NET