前提・実現したいこと
C#でクラス内の変数をforeachで変えたい場合はどうすれば,よろしいのでしょうか.
Data_AとData_Bの要素をランダムで選び,Data_Cを作られるのが理想です.
例
Data_A
列1 | 列2 | 列3 |
---|---|---|
1 | 2 | 3 |
Data_B
列1 | 列2 | 列3 |
---|---|---|
4 | 5 | 6 |
Data_C
列1 | 列2 | 列3 |
---|---|---|
4 | 2 | 6 |
該当のソースコード
C#
1public class main() 2{ 3 4 5 Data Data_A=new Data(); 6 Data Data_B=new Data(); 7 Data Data_C=new Data(); 8 //Dataへの代入は省略 9 10 foreach 11 //続きはどう書けばいいのか? 12 13} 14 15public class Data 16{ 17 18 public int variable; 19 20 public Calculation Calc; 21 22 public int Section; 23 24 public enum Calculation 25 { 26 plus,minus,multiplication 27 }; 28}
foreach の出番は無さそうです。
では,foreachを使わない方法はあるのでしょうか?
Data_A と Data_B を配列に入れ、シャッフルして最初の要素を取り出せばランダムにどちらかを選択できます。それを変数の回数繰り返せばいいでしょうが、変数には列挙子がないので、リフレクションを使わないのであれば foreach は使えません。高々三つの変数なので、リフレクションを使うまでもないと思います。
シャッフルと書きましたが、それより 0 か 1 の乱数を生成する方が簡単ですね。
リフレクションを使う場合を教えていただけないでしょうか.
次のようになります。
速度的には不利で、初心者には難解で、可読性も比較的低くなります。
あえて使うことはないと思います。
using System;
using System.Linq;
namespace ConsoleApp1
{
class Program
{
static void Main()
{
var dataA = new Data()
{
variable = 1,
Calc = Data.Calculation.plus,
Section = 3,
};
var dataB = new Data()
{
variable = 4,
Calc = Data.Calculation.minus,
Section = 6,
};
var fields = typeof(Data)
.GetFields()
.Where(a => new[] {
nameof(Data.variable),
nameof(Data.Calc),
nameof(Data.Section)}.Contains(a.Name))
.ToList();
var dataArray = new[] { dataA, dataB };
var random = new Random();
Console.WriteLine(nameof(dataA));
Console.WriteLine(dataA);
Console.WriteLine(nameof(dataB));
Console.WriteLine(dataB);
Console.WriteLine();
Console.WriteLine("dataC");
for (int i = 0; i < 10; i++)
{
var dataC = new Data();
foreach (var field in fields)
{
field.SetValue(dataC, field.GetValue(dataArray[random.Next(dataArray.Length)]));
}
Console.WriteLine(dataC);
}
}
}
public class Data
{
public int variable;
public Calculation Calc;
public int Section;
public enum Calculation
{
plus, minus, multiplication
};
public override string ToString()
=> $"variable:{variable}, Calc:{Calc}, Section:{Section}";
}
}
参考にします。
回答3件
あなたの回答
tips
プレビュー