2013-03-20T20:52:41の更新内容

programming/netfx/fcl/System.ArraySegment/index.wiki.txt

current previous
1,26 1,23
 
${smdncms:title,System.ArraySegment}
${smdncms:title,System.ArraySegment}
~
${smdncms:keywords,System,ArraySegment,配列,部分配列}
${smdncms:keywords,System,ArraySegment}
 
${smdncms:document_versions,codelang=cs,codelang=vb}
${smdncms:document_versions,codelang=cs,codelang=vb}
 

        

        
~
&msdn(netfx,type,System.ArraySegment`1){ArraySegment};は、配列の一部分(区間)を参照して部分配列をなす構造体。 例えば、「あるbyte配列の10番目から5つ分」といったデータを、ArraySegmentのインスタンス1つで表すことが出来る。
&msdn(netfx,type,System.ArraySegment`1){ArraySegment};は、配列とその一部分(区間)をあらわす構造体。 例えば、「あるbyte配列の10番目から5つ分」といったデータを、ArraySegmentのインスタンスで表すことが出来る。
 

        

        
~
ArraySegmentはオリジナルとなる配列の一部分をコピーは作成せず、直接参照する。 そのためArraySegmentを使えば、配列の一部を別の配列にコピーしてから渡す、といったことをする必要がなくなる。 例えば&msdn(netfx,member,System.Net.Sockets.Socket.Send){Socket.Send()メソッド};では、バッファのうち一部分だけを送信できるようにArraySegment<byte>を引数にとるオーバーロードが用意されている。
この構造体を単体で使用することはほとんどないが、この構造体をメソッドの引数として取ることでシグネチャを単純化できる。 例えばSystem.Net.Sockets.Socket.Send()メソッドでは、バッファのうち一部分だけを送信するという目的でArraySegmentを引数に取っている。 なお、この構造体はジェネリック型であるため、配列の型は任意の型を指定できる。
+

          
+
なお、この構造体はジェネリック型であるため、配列の型は任意の型を指定できる。
 

        

        
 
-関連するページ
-関連するページ
 
--[[programming/netfx/arrays]]
--[[programming/netfx/arrays]]
+
--[[programming/netfx/collections]]
 

        

        
 
#googleadunit
#googleadunit
 

        

        
 
*主なコンストラクタ
*主なコンストラクタ
~
:ArraySegment(T[] &var{array};, int &var{offset};, int &var{count};)|任意の型の配列&var{array};、区間を定義する最初のインデックス&var{offset};、区間を定義する要素の数&var{count};を指定してインスタンスを生成する。
:ArraySegment(T[], int, int)|任意の型の配列、区間を定義する最初のインデックス、区間を定義する要素の数を指定してインスタンスを生成する。
 

        

        
 
*主なプロパティ
*主なプロパティ
~
:T[] &msdn(netfx,member,System.ArraySegment`1.Array){Array};|参照される配列。 Tはジェネリック型。 コンストラクタで指定した配列と同じものが返される。
:&msdn(netfx,member,System.ArraySegment`1.Array){Array}; (T[])|参照される配列。 Tはジェネリック型。
~
:int &msdn(netfx,member,System.ArraySegment`1.Offset){Offset};|区間内の最初のインデックス。
:&msdn(netfx,member,System.ArraySegment`1.Offset){Offset}; (int)|区間内の最初のインデックス。
~
:int &msdn(netfx,member,System.ArraySegment`1.Count){Count};|区間内の要素の数。
:&msdn(netfx,member,System.ArraySegment`1.Count){Count}; (int)|区間内の要素の数。
 

        

        
 
*使用例
*使用例
 
ArraySegmentを用いて配列の区間を定義し、その区間内にある要素を表示する。
ArraySegmentを用いて配列の区間を定義し、その区間内にある要素を表示する。
121,86 118,3
 
0x0F 0x0E 0x0D 0x0C 0x0B 0x0A 0x09 0x08 0x07 0x06 0x05 0x04 0x03 0x02 0x01 0x00
0x0F 0x0E 0x0D 0x0C 0x0B 0x0A 0x09 0x08 0x07 0x06 0x05 0x04 0x03 0x02 0x01 0x00
 
}}
}}
 

        

        
+
*インターフェイス
+
.NET Framework 4.5以降のArraySegmentは、[[IList<T>やIReadOnlyList<T>>programming/netfx/collections/0_abstract]]といったインターフェイスを実装している。 そのため、ArraySegmentが表す部分配列の要素をインデクサを使って参照したり、LINQを使った操作を行ったり、ArraySegmentをコレクションとして扱えるようになっている。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.Collections.Generic;
+
using System.Linq;
+

          
+
class Sample
+
{
+
  static void Main()
+
  {
+
    var array = new[] {64, 15, 40, 10, 13, 54, 59, 74, 91, 80};
+

          
+
    // arrayの部分配列となるArraySegmentを作成
+
    var segment = new ArraySegment<int>(array, 3, 5);
+

          
+
    // foreachで列挙
+
    foreach (var val in segment) {
+
      Console.Write("{0}, ", val);
+
    }
+
    Console.WriteLine();
+

          
+
    // IReadOnlyList<int>にキャストし、インデクサを使って要素を参照
+
    IReadOnlyList<int> list = segment;
+

          
+
    for (var i = 0; i < list.Count; i++) {
+
      Console.Write("{0}, ", list[i]);
+
    }
+
    Console.WriteLine();
+

          
+
    // 部分配列内の最大値・最小値を求める
+
    Console.WriteLine("segment.Max() = {0}", segment.Max());
+
    Console.WriteLine("segment.Max() = {0}", segment.Min());
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Collections.Generic
+
Imports System.Linq
+

          
+
Class Sample
+
  Shared Sub Main()
+
    Dim array() As Integer = New Integer() {64, 15, 40, 10, 13, 54, 59, 74, 91, 80}
+

          
+
    ' arrayの部分配列となるArraySegmentを作成
+
    Dim segment As New ArraySegment(Of Integer)(array, 3, 5)
+

          
+
    ' foreachで列挙
+
    For Each val As Integer In segment
+
      Console.Write("{0}, ", val)
+
    Next
+
    Console.WriteLine()
+

          
+
    ' IReadOnlyList(Of Integer)にキャストし、インデクサを使って要素を参照
+
    Dim list As IReadOnlyList(Of Integer) = segment
+

          
+
    For i As Integer = 0 To list.Count - 1
+
      Console.Write("{0}, ", list(i))
+
    Next
+
    Console.WriteLine()
+

          
+
    ' 部分配列内の最大値・最小値を求める
+
    Console.WriteLine("segment.Max() = {0}", segment.Max())
+
    Console.WriteLine("segment.Max() = {0}", segment.Min())
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(実行結果){{
+
10, 13, 54, 59, 74, 
+
10, 13, 54, 59, 74, 
+
segment.Max() = 74
+
segment.Max() = 10
+
}}
+

          
+

          
+

          
+