3

いつものように、ヘルプ/コメントの考えは常に高く評価されており、私のプログラミングの素朴さをお詫びします.

ブロックのランダム化を含む将来の研究で使用できる、広く適用可能な関数を作成しようとしています。PatientDataCollection の各メンバーには、interventionArm、givenDrugX などの名前のブール プロパティがあります。この関数は、ブロック サイズに応じて (疑似) ランダムに研究のアームに割り当てることを目的としています。つまり、ブロック サイズが 8 の場合、4 が治療に割り当てられ、4 が対照 (治療なし) に割り当てられます。

これまでのコード:

 public static bool nextAllocation<T>(int blockSize, IEnumerable<T> patientDataCollection, string allocationPropertyName)
 {
    int remainingAllocations = blockSize - patientDataCollection.Count();
    if (remainingAllocations <= 0) throw new Exception("All alocations within block accounted for");
    var p = typeof(T).GetProperty(allocationPropertyName);

    int remainingInterventions = blockSize/2 - patientDataCollection.Count(c => c.p);
    double Pintervention = (double)remainingInterventions / (double)remainingAllocations;
    double rdm = new Random().NextDouble();
    return (rdm <= Pintervention);
 }

変数 p は linq ステートメントの patientDataCollection.Count(c => cp) で参照されている cp に関連していないため、これはもちろん欠陥のあるロジックです。明らかに、このステートメントは、真の値を持つすべての要素を数えるだけです。

ASPは4.0です。誰でもこれを達成する方法を見ることができますか

4

3 に答える 3

2

Func<T, bool>カウントに使用されるa をメソッドに渡すことができます。

public static bool nextAllocation<T>(int blockSize, IEnumerable<T> patientDataCollection, Func<T,bool> predicate) 
{ 
    int remainingAllocations = blockSize - patientDataCollection.Count(); 
    if (remainingAllocations == 0) throw new Exception("All alocations within block accounted for"); 
    int remainingInterventions = blockSize/2 - patientDataCollection.Count(predicate); 
    double Pintervention = remainingInterventions / remainingAllocations; 
    double rdm = new Random().NextDouble(); 
    return (rdm <= Pintervention); 
}

使用例は次のようになります。

var result = nextAllocation(10, collection, c=>c.interventionArm);
于 2012-06-29T08:16:15.307 に答える
1

リフレクションを使用して、プロパティの値を取得できます。

int remainingInterventions = blockSize/2 - 
    patientDataCollection.Count(c => (bool)p.GetValue(c,null));

エラーチェックも追加。

于 2012-06-29T02:08:27.817 に答える
0

式を使用してみてください

public static class ExpressionCreator
{
    public static Func<T, TProperty> CreatePropertyAccessExpression<T, TProperty>(string propertyName)
    {
        var tType = typeof (T);
        var property = tType.GetProperty(propertyName);
        var parameterExpression = Expression.Parameter(tType);
        var memberAccessExpression = Expression.MakeMemberAccess(parameterExpression, property);
        var lambda = Expression.Lambda<Func<T, TProperty>>(memberAccessExpression, parameterExpression);
        return lambda.Compile();
    }
}

使用例:

    public class A
    {
        public bool Thing1 { get; set; }
        public bool Thing2 { get; set; }
    }

    static void Main(string[] args)
    {
        var @as = new A[10];
        for(var i = 0; i < @as.Length; i+=2)
        {
            @as[i] = new A {Thing1 = true};
            @as[i + 1] = new A {Thing2 = i%4 == 0};
        }

        var thing1Expression = ExpressionCreator.CreatePropertyAccessExpression<A, bool>("Thing1");
        var thing2Expression = ExpressionCreator.CreatePropertyAccessExpression<A, bool>("Thing2");
        Console.WriteLine(@as.Count(thing1Expression));
        Console.WriteLine(@as.Count(thing2Expression));
        Console.ReadLine();
    }
于 2012-06-29T05:58:03.220 に答える