在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;
}
但是,如果超过这两种类型怎么办?好吧,我可以把这个bool参数变成一个整数或一个字符串,但是我需要保留一个包含所有键值及其各自字段的表...这有可能导致混乱和反直觉我添加和/或删除示例结构的字段,我甚至不想再考虑它了。
那么,有没有办法做我正在考虑的事情,创造这样一个灵活的功能?或者我必须坚持可怕的Ctrl + C Ctrl + V?
答案 0 :(得分: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);
答案 1 :(得分: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...
}
}
或者您可以将通用函数与谓词一起使用。