1

像 Linq 的 OrderBy 这样的东西,你可以在其中指定它应该用来进行排序的键。

具体来说,在我的例子中,我有一个等效于具有两个 bool 属性的结构,一个 .IsNice 和另一个 .IsPretty; 然后我希望能够执行一个函数,返回一个实例是漂亮还是漂亮。

我可以做两个功能,

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

然而,两者本质上是一样的!两者都无非是返回验证。(IsPretty / IsNice),我不想有复制和粘贴的功能。

另一种选择是进行以下操作:

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

但是,如果不止这两种类型呢?好吧,我可以将此布尔参数转换为整数或字符串,但随后我需要保留一个包含所有键值及其各自字段的表......这有可能导致混乱和反直觉我添加和/或删除示例结构的字段,我什至不想再考虑它了。

那么,有没有办法按照我的想法来创建这样一个灵活的功能?还是我必须坚持可怕的 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

您可以使用枚举器作为第二个参数:

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 回答