2 回答
TA贡献1877条经验 获得超1个赞
解决方案 #1 订购值数组
我只是在某种集合中定义这些 id 的顺序,可以是一个数组:
var orderArray = new int[]
{
8106, // Confirmed Out of Busine
8105, // Bankruptcy
8111, // Lack of Licensing
8109, // Investigations
8103, // Government Actions
8104, // Pattern of Complaints
8112, // Customer Reviews
8110, // Accreditation
8101, // Misuse of BBB Name
8107, // Advisory
8102, // Advertising Review
};
然后迭代数组,同时递增订单值。循环检查订单数组是否包含我正在尝试评估的订单值的实际类型 id:
for (int orderValue = 0; orderValue < orderArray.Length; orderValue++)
{
if (alertTypeId == orderArray[orderValue])
{
return orderValue;
}
}
如果在数组中找不到,则返回可能的最大值:
return int.MaxValue
整个方法如下所示,它将评估警报类型 id 的顺序:
public int GetAlertTypeIdOrder(short alertTypeId)
{
var orderArray = new int[]
{
8106, // Confirmed Out of Busine
8105, // Bankruptcy
8111, // Lack of Licensing
8109, // Investigations
8103, // Government Actions
8104, // Pattern of Complaints
8112, // Customer Reviews
8110, // Accreditation
8101, // Misuse of BBB Name
8107, // Advisory
8102, // Advertising Review
};
for (int orderValue = 0; orderValue < orderArray.Length; orderValue++)
{
if (alertTypeId == orderArray[orderValue])
{
return orderValue;
}
}
return int.MaxValue;
}
用法:
var sortedAlerts = alerts
.AllAlerts
.OrderByDescending(a => GetAlertTypeIdOrder(a.AlertTypeId))
.ToList();
它也以下降的方式工作。
解决方案#2 订单值字典
您可以通过减少冗余(重复创建存储顺序值的数组)来获得更好的性能。更好的主意是将顺序规则存储在字典中。我知道下面的代码也创建了一个数组,但概念是它将被调用一次以获取然后传递的字典。
public Dictionary<int, int> GetOrderRules()
{
var alertTypeIds = new int[]
{
8106, // Confirmed Out of Busine
8105, // Bankruptcy
8111, // Lack of Licensing
8109, // Investigations
8103, // Government Actions
8104, // Pattern of Complaints
8112, // Customer Reviews
8110, // Accreditation
8101, // Misuse of BBB Name
8107, // Advisory
8102, // Advertising Review
};
var orderRules = new Dictionary<int, int>();
for (int orderValue = 0; orderValue < alertTypeIds.Length; orderValue++)
{
orderRules.Add(alertTypeIds[orderValue], orderValue);
}
return orderRules;
}
因此该GetAlertIdOrder()方法看起来会有所不同,但仍然保留以前解决方案的想法:
public int GetAlertIdOrder(short alertTypeId, IDictionary<int, int> orderRules)
{
if (orderRules.TryGetValue(alertTypeId, out int orderValue))
{
return orderValue;
}
else
{
return int.MaxValue;
}
}
用法:
var orderRules = GetOrderRules();
var sortedAlerts = alerts
.AllAlerts
.OrderBy(a => GetAlertIdOrder(a.AlertTypeId, orderRules))
.ToList();
TA贡献1859条经验 获得超6个赞
(a) 我不会将排序与映射器混合使用。让映射器做它自己的事情。(这是关注点分离).. 又名,没有排序/排序。恕我直言,你总是会在映射器中遇到太多难以理解的巫术。通过上面的代码,您已经走上了这条道路。
(b) 如果“OverviewAlerts”是 AllAlerts 的子集(又名 AllAlerts 是超集),则水合 AllAlerts,并创建一个只读“get”属性,您可以在其中按其规则将 AllAlerts 筛选到您的子集。(可选)考虑 AllAlertsSorted get 属性。这样,您就可以让消费者选择是想要原始的还是排序的……因为排序是有成本的。
public class BPAlerts
{
public List<BPAlert> AllAlerts { get; set; }
public List<BPAlert> OverviewAlerts {
get
{
return null == this.AllAlerts ? null : this.AllAlerts.Where (do you filtering and maybe sorting here ) ;
}
}
}
public List<BPAlert> AllAlertsSorted{
get
{
return null == this.AllAlerts ? null : this.AllAlerts.Sort(do you filtering and maybe sorting here ) ;
}
}
}
如果您执行只读属性,那么您将拥有更简单的 linq 操作,例如
OrderBy(x => x.PropertyAbc).ThenByDescending(x => x.PropertyDef);
我 99% 的映射代码都是这样的。如果您提供空输入,我什至不会抛出错误,我只是返回空。
public static class MyObjectMapper {
public static ICollection < MyOtherObject > ConvertToMyOtherObject(ICollection <MyObjectMapper> inputItems) {
ICollection <MyOtherObject> returnItems = null;
if (null != inputItems) {
returnItems = new List <MyOtherObject> ();
foreach(MyObjectMapper inputItem in inputItems) {
MyOtherObject moo = new MyOtherObject();
/* map here */
returnItems.Add(moo);
}
}
return returnItems;
}
}
- 2 回答
- 0 关注
- 87 浏览
添加回答
举报