読者です 読者をやめる 読者になる 読者になる

C#_Listの要素数を求める

C# プログラム

リスト.Count( );

 

ex)

リスト

List<int> t = new List<int> { 100, 200, 300, 400, 500 };
t.Count();
//t 要素数:5

 

リスト一次元配列

List<int> testListT = new List<int>
{
    new List<int> {11, 22, 33},
    new List<int> {41, 52, 63},
    new List<int> {71, 82, 93},
    new List<int> {21, 32, 43},
};
int tT1 = testListT.Count();
int tT2 = testListT.Length;
int tT3 = testListT.GetLength(0);
int tT4 = testListT.GetLength(1);
//tT1 要素数:4
//tT2 要素数:4
//tT3 要素数:4
//tT4 エラー:二次元配列をカウントしている故

 

リスト二次元配列

List<int>[,] testList = new List<int>[,] {
    {
       new List<int> {100, 200, 300, 400},
       new List<int> {101, 102, 103, 104},
       new List<int> {201, 202, 203, 204},
    },
    {
       new List<int> {301, 302, 303, 304},
       new List<int> {401, 402, 403, 404},
       new List<int> {501, 502, 503, 504},
    }
};
int aC = testList.Count();
int a0 = testList.Length;
int a1 = testList.GetLength(0);
int a2 = testList.GetLength(1);
int a3 = testList.GetLength(2);
//aC エラー:二次元Listはカウントできない
//a0 要素数:6
//a1 要素数:2
//a2 要素数:3
//a3 エラー:三次元をカウントしている故

//補足
List<int> aaa = testList[0,0];
int a = testList[0, 1][1];
foreach (var v in testList)
//testList の中は二次元配列
{
    int cT = v.Count();
}
//aaa:List<int> {001 , 002, 003, 004}
//a:102
//cT 要素数:4

 

 

 以上。

 

C#_List の二次元配列

C# プログラム

要素へのアクセス方法が分からなくなったのでメモ。

List の一次元配列

List<int> testListT = new List<int>
{
    new List<int> {11, 22, 33},
    new List<int> {41, 52, 63},
    new List<int> {71, 82, 93},
    new List<int> {21, 32, 43},
};

List<int> a = testListT[0];
int aa = testListT[0][0];
int ab = testListT[0][1];
int ac = testListT[0][2];
//a の要素:{11, 22, 33}
//aa の要素:11
//ab の要素:22
//ac の要素:33

List<int> b = testListT[1];
int ba = testListT[1][0];
int bb = testListT[1][1];
int bc = testListT[1][2];
//b の要素:{41, 52, 63}
//ba の要素:41
//bb の要素:52
//bc の要素:63

 

List の二次元配列

List<int>[,] testList = new List<int>[,] {
    {
       new List<int> {100, 200, 300, 400},
       new List<int> {101, 102, 103, 104},
       new List<int> {201, 202, 203, 204},
    },
    {
       new List<int> {301, 302, 303, 304},
       new List<int> {401, 402, 403, 404},
       new List<int> {501, 502, 503, 504},
    },
};
List<int> aT = testList[0,0];
int aaT = testList[0, 0][0];
int abT = testList[0, 0][1];
int acT = testList[0, 0][2];
int adT = testList[0, 0][3];
//aT の要素:{100, 200, 300, 400}
//aaT の要素:100
//abT の要素:200
//acT の要素:300
//adT の要素:400

List<int> bT = testList[1, 2];
int baT = testList[1, 2][0];
int bbT = testList[1, 2][1];
int bcT = testList[1, 2][2];
int bdT = testList[1, 2][3];
//bT の要素:{501, 502, 503, 504}
//baT の要素:501
//bbT の要素:502
//bcT の要素:503
//bdT の要素:504

※ 二次元のイメージ

f:id:koshinRan:20170419030426j:plain

 

 以上。

C#_配列の要素数 (長さ) を求める

C# プログラム

総数を求める場合

配列.Length;

 

次元ごとに求める場合

多次元配列.GetLength( 次元数 );

0 が一番浅い。

 

以下、サンプルコード 

一次元

int testO = new int { 2, 3, 4, 5 };
int c1 = testO.Length;
//c1長さ:4

 

二次元

string[,] testT = new string[3, 4] {
  {"あ", "い", "う", "え" },
  {"か", "き", "く", "け" },
  {"さ", "し", "す", "せ" },
};
int c21 = testT.Length;
int c22 = testT.GetLength(0);
int c23 = testT.GetLength(1);
//c21長さ:12
//c22長さ:3
//c23長さ:4

 

三次元

int[,,] testThArray = new int[2,3,4] {
    {
        {001, 002, 003, 004},
        {101, 102, 103, 104},
        {201, 202, 203, 204},
    },
    {
       {301, 302, 303, 304},
       {401, 402, 403, 404},
       {501, 502, 503, 504},
    },
};
int c3T = testThArray.Length;
int c30 = testThArray.GetLength(0);
int c31 = testThArray.GetLength(1);
int c32 = testThArray.GetLength(2);
//c3T長さ:24
//c30長さ:2
//c31長さ:3
//c32長さ:4

 

三次元のような配列

int[][,] testThAlmost = new int[2][,] {
   new[,] {
       {10, 11, 12, 13},
       {20, 21, 22, 23},
       {31, 32, 33, 24}
   },
   new[,] {
       {70, 71, 72, 73},
       {80, 81, 82, 83},
       {91, 92, 93, 94}
   }
};
int cA31 = testThAlmost.Length;
int cA32 = testThAlmost.GetLength(0);
int cA33 = testThAlmost.GetLength(1);
//cA31長さ:2
//cA32長さ:2
//cA33長さ:エラー

foreach (var tT in testThAlmost)
{
    int i = tT.GetLength(0);
    int j = tT.GetLength(1);
    //i長さ:3
    //j長さ:4
    //tT は testThAlmost[0] と testThAlmost[1] (二次元配列)
}

 

こちらを参照
https://www.ipentec.com/document/document.aspx?page=csharp-get-array-length

 

以上。
List ではCountを用いる。

C#_ファイルダイアログボックスの拡張子フィルター

C# プログラム

 どこに書くか忘れるし、どうやって書くか忘れるのでメモ。

  1. saveFileDialog や openFileDialog を配置。
  2. プロパティの「動作」にある「Filter」に以下を記述。
    表示する文字|拡張子

    複数設定したい場合は、そのままバーティカルバー( | )で区切る。
    文字1|拡張子1|文字2|拡張子2

  3. 終わり。

 

コードで設定する場合は以下の様に記述。

openFileDialog.Filter = "全て|*.*|絵|*.jpg";

 

以上。

↓ キャプチャ
2.
f:id:koshinRan:20170417233308j:plain

3.
f:id:koshinRan:20170417233208j:plain

C#_ジェネリックコレクションとは

C# プログラム

ジェネリック:型に依存しないで記述する為の仕組み。
コレクション:collection [可算名詞] 収集物、収蔵品、集まり。

ジェネリックコレクション

型に依存しないデータの箱 (データの型が int でも float でも使える箱)。

 

ジェネリックコレクションクラス ( List クラス や Dictionary クラス )

型に依存しないデータの箱を表すクラス ( 設計書 )。
表現を変えると、
データの集まり( コレクション )を扱うジェネリック( 型に依存しない )クラス。

 

コレクション ( collection:データの集まり ) を管理する方法には複数ある。
それぞれ一長一短があり、目的に応じて使い分ける。
大きく分けて 3 系統。

  • リスト系
    挿入した順序に意味があるコレクション。
    インデックスを使った読み書きができたり、
    挿入した順番通りに要素を取り出せたりするタイプ。

     

  • セット系
    順序に意味を持たない。
    要素を含んでいるかどうかということだけに意味がある。
    順序は狂っても構わないので、要素の検索だけを高速にできてほしい
    コレクションのことをセットと呼ぶ。( set:数学的な意味での集合 )

     

  • 辞書系
    キーを指定して値を検索する必要がある場合に使うコレクション。
    「キーと値のペア」をよそとするセットを作ればいいので、
    内部的なアルゴリズムはセットと同様になる。
    ( 逆をいうと、セットは値のない( キーのみの )辞書と考えることもできる )

キー:要素を指定するための文字列、あるいは数値のこと。
数値の場合はインデックスと呼ばれることがある。 

 

リスト系 ( 順序に意味を持つ )

種類用途
List<T> 

インデックスを使って要素を読み書きする場合に使用。
特に、ランダム アクセスが必要な場合に使用。

LinkedList<T>

事前に大きめの領域を確保したくない場合や、
要素の数が大きく変わるので、事前確保の量を決めにくい場合に
使用。

Stack<T>

LIFO ( last in first out ) 後に入れた要素を先に出す。
要素を上に積み上げていくので、スタック ( stack:積み荷 ) と
呼ぶ。
一番上をどけないと、次の要素を取り出せない。

Queue<T> 

FIFO ( first in first out ) 先に入れた要素を先に出す。
後に並んで前から出ていくので、キュー ( queue:待ち行列 ) と
呼ぶ。

 

セット系 ( 要素の有無のみ。順序に意味を持たない )

種類用途
HashSet<T> 

メモリに余裕がある場合には最も高速なセット。
要素の順序保証はなし。
型はGetHashCode メソッドを正しく定義している必要あり。

SortedSet<T>

事前に大きめの領域を確保したくない場合や、
要素の数が大きく変わるので、事前確保の量を決めにくい場合に
使用。
要素の大小によって整列した状態で要素を列挙出来る。

 

辞書系 ( キーと値のペアを要素とするセット )

種類用途

Dictionary
<TKey, TValue> 

HashSet の辞書版。
キーによる順序保証はなし。

SortedDictionary
<TKey, TValue>

SortedSet の辞書版。

SortedList
<TKey, TValue>

 要素の挿入・削除より、検索の方が圧倒的に多い場合に使用。

 

 参考というかほぼ引用。
http://ufcpp.net/study/dotnet/bcl_collection.html

 

 以上。

< Memo >
仕組み:事をうまく運ぶために工夫された計画。くわだて。 

C#_配列のインデックスを再採番 (サイズ変更)

C# プログラム

結論。
配列のままではめんどくさそう。
List に変換することにした。

  1. 既にある配列を .ToList< 型 >List 化 し変数に格納。
  2. List を格納したデータを Remove したり Add したりする。
  3. 変更した List を配列に格納

 

ex 1 )
intTest という配列データを Listして intList に格納。
intList のデータの中身を配列 pre1 と pre2 に振り分けるコード。

//配列生成
int[ ] intTest = new int[20];
for (int i = 0; i < 20; i++)
{
    intTest[i] = i;
}

//List に変換
List<int> intList = new List<int>();
intList = intTest.ToList<int>();

//pre1 intList の 0~9 を格納
int[ ] pre1 = new int[10];
for (int i = 0; i < 10; i++)
{
    pre1[i] = intList[0];
    intList.RemoveAt(0);
}

//残った List の要素を pre2 の配列へと格納
int[ ] pre2 = new int[5];
for (int i = 0; i < 5; i++)
{
    pre2[i] = intList[i];
}

 

ex 2 )
intTest という一次配列Listして intList に格納。
intList のデータを 三次元的な配列 arrayThree に変換するコード。
arrayThree は二つの要素を持っており、その中に二次配列を格納。

//配列生成
int[ ] intTest = new int[50];
for (int i = 0; i < 50; i++)
{
    intTest[i] = i;
}

//List に変換
List<int> intList = new List<int>();
intList = intTest.ToList<int>();

//三次元的 List に変換
int indexL = 0;
int[ ][,] pre = new int[2][, ];
for (int a = 0; a < 2; ++a) {
    pre[a] = new int[5,5];
    for (int j = 0; j < 5; j++)
    {
        for (int i = 0; i < 5; i++)
        {
            pre[a][j, i] = intList[indexL];
            ++indexL;
        }
    }
}

//配列へ格納
int[ ][,] arrayThree = new int[2][,];
arrayThree = pre;

 一次元配列 intTest を
f:id:koshinRan:20170415022634j:plain

三次元的配列 arrayThree に変換。
f:id:koshinRan:20170415022750j:plain

 

以上。

C#_List の一次元配列

C# プログラム

ただの List

//List<int> intList = new List<int>() { 10, 20, 30 };
//OR
List<int> intList = new List<int>();
intList.Add(10);
intList.Add(20);
intList.Add(30);

intList は以下の様に格納。

f:id:koshinRan:20170411001021j:plain

 

■Listの一次元配列

List<int>[ ] intList = new List<int>[ ]
{
    new List<int> {10, 11, 12},
    new List<int> {20, 22, 24},
    new List<int> {30, 33, 36},
    new List<int> {40, 44, 48}

};

 

List<int>[ ] intList = new List<int>[4];
for (var i = 1; i < 5; i++)
{
    intList[i - 1] = new List<int> { 10 * i, 11 * i, 12 * i };
};

上2つの inList は以下の様に格納される。

f:id:koshinRan:20170411004657j:plain

 

 以上。