1

LinqのOrderByのようなもので動作しているもので、順序付けを行うためのキーを指定できます。

具体的に言うと、私の場合、1つは.IsNice、もう1つは.IsPrettyの2つのboolプロパティを持つ構造体に相当します。次に、インスタンスがPrettyであるかIsNiceであるかを返す関数を実行できるようにします。

私は2つの機能を作ることができました、

    bool itIsPretty (ExampleStruct toVerify);
    bool itIsNice (ExampleStruct toVerify);

ただし、どちらも基本的に同じものです。どちらもVerifyに戻るだけです。(IsPretty / IsNice)、コピーアンドペースト機能は必要ありません。

もう1つの方法は、次のようにすることです。

    bool isItNiceOrPretty (ExampleStruct toVerify, bool checkForNiceness)
    {
        if (checkForNiceness) return toVerify.IsNice;
        else return toVerify.IsPretty;
    }

しかし、これら2つのタイプよりも多い場合はどうなるでしょうか。このboolパラメータを整数または文字列に変換することはできますが、すべてのキー値とそれぞれのフィールドを含むテーブルを保持する必要があります...これは、次の場合に混乱や直感に反する可能性があります。構造体の例のフィールドを追加および/または削除しますが、これ以上考えたくありません。

それで、私が考えていることを実行して、そのような柔軟な機能を作成する方法はありますか?それとも、恐ろしいCtrl + C Ctrl + Vに固執する必要がありますか?

4

2 に答える 2

4

を渡すことができますFunc<ExampleStruct,bool>

bool DoSomething(ExampleStruct value, Func<ExampleStruct,bool> predicate)
{
    if (predicate(value))
    {
       // Do your thing
    }
}

次に、次の方法でこれを呼び出すことができます。

bool result = DoSomething(toVerify, v => v.IsNice);
于 2013-01-15T00:20:52.470 に答える
0

2 番目のパラメーターとして列挙子を使用できます。

public enum CheckType
{
    Nice,
    Pretty,
    // And so on...
}

public Boolean IsWhat(ExampleStruct struct, CheckType type)
{
    switch (type)
    {
        case CheckType.Pretty: 
           return toVerify.IsPretty;

         // And so on...
    }    
}

構造が異なる場合は、共通のインターフェースを実装できます。

public interface ILook
{
    Boolean IsNice { get; }
    Boolean IsPretty { get; }
}

public struct ExampleStructA : ILook { }

public Boolean IsWhat(ILook tiVerify, CheckType type)
{
    switch (type)
    {
        case CheckType.Pretty: 
           return toVerify.IsPretty;

         // And so on...
    }    
}

または、述語でジェネリック関数を使用することもできます。

于 2013-01-15T00:27:13.050 に答える