C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: 配列の初期化


(過去ログ 37 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■19028 / inTopicNo.1)  配列の初期化
  
□投稿者/ tanaka (74回)-(2008/05/19(Mon) 13:21:18)

分類:[C#] 

配列変数の値を同じ値で初期化したい場合、C言語であればmemset()を使用すれば
いいと思うのですがc#の場合それ相当のメソッドはあるのでしょうか。
宣言時に初期値をセットしてもいいのですが配列数が多いと大変なので。
for文でセットしてもいいんですが違う方法があればお願いします。

【例:全てに1をセット】
// C#の場合場合
int[] a = new int[100];
    ?

// C言語の場合
int a[100];
memset(a,1,sizeof(a));

引用返信 編集キー/
■19031 / inTopicNo.2)  Re[1]: 配列の初期化
□投稿者/ ゆーち (7回)-(2008/05/19(Mon) 13:40:35)
C#知らないあちきは答えきれないんですが・・・とりあえず、目に入ってきたので。

>// C言語の場合
>int a[100];
>memset(a,1,sizeof(a));

これ、ほとんどの処理系で「1」で埋め尽くされませんよ。
引用返信 編集キー/
■19032 / inTopicNo.3)  Re[1]: 配列の初期化
□投稿者/ 組込系の人 (63回)-(2008/05/19(Mon) 13:42:26)
2008/05/19(Mon) 13:51:50 編集(投稿者)
2008/05/19(Mon) 13:51:35 編集(投稿者)
2008/05/19(Mon) 13:44:37 編集(投稿者)
2008/05/19(Mon) 13:43:36 編集(投稿者)
2008/05/19(Mon) 13:43:05 編集(投稿者)

最近配列をめったに使わなくなった私です。

    List<int> a = new List<int>;
    for(int i = 0; i < 100; i++){
        a.Add(1);
    }
こんなのはどうでしょうか?



・・・図表モードがうまく使えない・・・orz

引用返信 編集キー/
■19035 / inTopicNo.4)  Re[2]: 配列の初期化
□投稿者/ れい (552回)-(2008/05/19(Mon) 14:30:24)
私はやりませんが。
こんなのなら出来なくもないです。

PInvokeでVB、且つByte型限定ですが。

<DllImport("kernel32.dll", EntryPoint:="RtlFillMemory")> _
Shared Sub FillMemory(<[In](), Out()> ByVal Destination As Byte(), ByVal Length As UInt32, ByVal Fill As Byte)
End Sub


Dim buf As Byte()
buf = New Byte(100000) {}
FillMemory(buf, buf.Length, 10)

引用返信 編集キー/
■19038 / inTopicNo.5)  Re[1]: 配列の初期化
□投稿者/ アキラ (42回)-(2008/05/19(Mon) 14:47:50)
アキラ さんの Web サイト
2008/05/19(Mon) 14:50:00 編集(投稿者)
2008/05/19(Mon) 14:49:29 編集(投稿者)
2008/05/19(Mon) 14:49:23 編集(投稿者)

No19028 (tanaka さん) に返信
> 【例:全てに1をセット】
> // C#の場合場合
> int[] a = new int[100];
>     ?

Select 使うとか

foreach (int item in a.Select(x => x = 1))
{
Console.WriteLine(item); // 1, 1, 1, 1, 1, ....
}


こっちの方が例としてはいいかな
a = a.Select(x => x = 1).ToArray();
引用返信 編集キー/
■19040 / inTopicNo.6)  Re[2]: 配列の初期化
□投稿者/ アキラ (43回)-(2008/05/19(Mon) 14:59:34)
アキラ さんの Web サイト
2008/05/19(Mon) 15:00:37 編集(投稿者)
2008/05/19(Mon) 15:00:02 編集(投稿者)
2008/05/19(Mon) 14:59:53 編集(投稿者)

二重投稿になってしまったので削除します。
引用返信 編集キー/
■19041 / inTopicNo.7)  Re[2]: 配列の初期化
□投稿者/ アキラ (44回)-(2008/05/19(Mon) 15:00:05)
アキラ さんの Web サイト
2008/05/19(Mon) 15:01:31 編集(投稿者)
それか、以下のような拡張メソッドを用意しておけば

public static partial class Extensions
{
    public static void Fill<T>(this T[] source, T value)
    {
        for (int i = 0; i < source.Length; i++)
        {
            source[i] = value;
        }
    }
}


こう書けますね
int[] a = new int[100];
a.Fill(1); // 1で埋める

引用返信 編集キー/
■19047 / inTopicNo.8)  Re[3]: 配列の初期化
□投稿者/ 渋木宏明(ひどり) (758回)-(2008/05/19(Mon) 17:01:32)
渋木宏明(ひどり) さんの Web サイト
int[] array = Enumerable.Repeat(1, 100).ToArray();

でおk。
引用返信 編集キー/
■19056 / inTopicNo.9)  Re[2]: 配列の初期化
□投稿者/ Azulean (115回)-(2008/05/19(Mon) 22:30:20)
> >memset(a,1,sizeof(a));
> これ、ほとんどの処理系で「1」で埋め尽くされませんよ。
補足しておきます。

http://msdn.microsoft.com/ja-jp/library/1fdeehz6.aspx

memsetは文字(char)単位で処理します。char型は大抵1バイトです。
これに対して、int型はVC++等は4バイトとなります。

4バイトの型に対してmemsetで1をセットするとどうなるか?それは0x01010101という形で書き込まれ、16,843,009という整数を意味するバイト列になるでしょう。(a[0] == 16843009)
この辺の仕組みについての解説は省略します。気になるのであれば調べてみて下さい。
引用返信 編集キー/
■19068 / inTopicNo.10)  Re[4]: 配列の初期化
□投稿者/ tanaka (76回)-(2008/05/20(Tue) 08:35:23)
No19047 (渋木宏明(ひどり) さん) に返信
> int[] array = Enumerable.Repeat(1, 100).ToArray();
>
> でおk。
ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -