我是否明智地使用此LINQ语句根据动态子集获取项目的子集?

时间:2010-04-28 17:15:21

标签: c# linq collections

我正在开发一个需要处理多种不同类型数据的ASPX页面。我想出了一种可能理想的时尚来获取我需要的信息,但我不确定它是否像它的感觉一样好。基本上,我需要将一个集合过滤到一个子集中,但我过滤的值会因环境而异。我构建了以下代码片段似乎工作正常。

List<string> lStr = new List<string>() {
    "Category",
    "Document Number", //Case 1 Only
    "Document Title", //Case 1 Only
    "Picture Title", //Case 2 Only
    "Picture Number", //Case 2 Only
    "Issue",
    "Issue Date",
    "Issue Title",
    "Notes",
    "High Priority" //Case 1 Only
};
AddControls(bigDataInput.Fields.OfType<FieldObject>().Where(x => lStr.Contains(x.Title)).ToArray());

bigDataInput是一个对象,它有一个名为Fields的属性,它是一个名为FieldObject的对象集合。我需要根据标题获取这些FieldObject的子集,并将它们全部传递给方法AddControls(params FieldObject[] fields)。问题是我需要过滤哪些标题会因bigDataInput本身而异。目前只有两种情况,这些是我需要过滤掉的字段。

  • bigDataInput案例1 :类别,文档编号,文档标题,问题,发布日期,问题标题,注释,高优先级
  • bigDataInput案例2 :类别,图片标题,图片编号,问题,发行日期,问题标题,注释

除了我需要的那些之外,bigDataInput还有其他字段。但是,当且仅当我真的需要该特定情况的字段时,字段集合才会有一个过滤字段。例如,案例1没有图片标题和图片编号字段,案例2没有文档编号,文档标题和高优先级字段。这种限制也适用于所有未来的案件,无论可能有多少案件。

我首先考虑根据特定的案例场景构建一个List,但构建它的switch case可能会变得非常大,并且在某种程度上会重复。就在那时我想出了上面代码片段的想法。但这实际上是个好主意吗?或者是否有比这更好的方法,但比可能非常大的开关情况更简洁?

1 个答案:

答案 0 :(得分:1)

很难绕过你的确切问题,但从它的内容来看,使用一些设计模式对它进行一些不同的攻击可能是有意义的。可能有意义的是战略模式。基本上,这是一种从主机封装算法(逻辑)的方法。

维基百科在战略模式中有一个条目:http://en.wikipedia.org/wiki/Strategy_pattern

我正在考虑这样的流程:

  • 你有一个名为IDataInputTransformer的接口,它有两个方法:bool AcceptsInput(bigDataInput i)和FieldObject [] TransformInput(bigDataInput i)

  • 调用类有一个IEnumerable的IDataInputTransformers,它以某种方式设置 - 手动实例化或使用依赖注入或其他东西

  • 传递一个bigDataInput后,调用类遍历每个IDataInputTransformer并使用bigDataInput调用AcceptsInput。如果输入不被接受,它只是尝试下一个&amp;下一个(如果没有接受输入,则可能抛出异常或其他内容)。如果IDataInputTransformer接受输入,则可以调用TransformInput并获取将传递给AddControls的FieldObject []

你可以更进一步,但这是基本的想法。这里的好处是:

  • 可读性 - 真的很容易 读 FinanceDepartmentInputTransformer.TransformInput() 很难读到一个巨大的 开关
  • 能够更改 - 您可以轻松添加新的InputTransformers(并且不会破坏可读性或功能)
  • 规则是隔离的 - 您可以在AcceptsInput方法
  • 中轻松检查业务规则
  • 便携性 - 您也可以在其他地方使用
  • 可测试性 - 您可以轻松地对其进行单元测试以确保其正常工作