我有两种方法正在做类似的功能。我想将这两者合并为一,以便代码不重复。
第一种方法:
private string GetPlanogramStatusListString()
{
string outValue = null;
if (this.POGSelectedStatusList != null)
{
outValue = "";
// Parse the string list to get enum values into a list
List<string> tempStatusList = new List<string>();
foreach (object sts in this.POGSelectedStatusList)
{
PogStoreData.PlanogramStatusCode enumValue;
if (Enum.TryParse<PogStoreData.PlanogramStatusCode>(sts.ToString(), out enumValue))
{
tempStatusList.Add(((int)enumValue).ToString());
}
}
outValue = string.Join(",", tempStatusList);
}
return outValue;
}
第二种方法:
private string GetMoveStatusListString()
{
string outValue = null;
if (this.POGMovedStatus != null)
{
outValue = "";
// Parse the string list to get enum values into a list
List<string> tempStatusList = new List<string>();
foreach (object sts in this.POGMovedStatus)
{
PogStoreData.POGMovedStatus enumValue;
if (Enum.TryParse<PogStoreData.POGMovedStatus>(sts.ToString(), out enumValue))
{
tempStatusList.Add(((int)enumValue).ToString());
}
}
outValue = string.Join(",", tempStatusList);
}
return outValue;
}
我想将这两种方法合并为一种方法。我怎么能这样做?
答案 0 :(得分:1)
我实际编译并运行此代码:
private string GetEnumListString<T>(IEnumerable list) where T : struct
{
string outValue = null;
if (list != null)
{
outValue = "";
// Parse the string list to get enum values into a list
List<string> tempStatusList = new List<string>();
foreach (object sts in list)
{
T enumValue;
if (Enum.TryParse(sts.ToString(), out enumValue))
{
tempStatusList.Add((Convert.ToInt32(enumValue)).ToString());
}
}
outValue = string.Join(",", tempStatusList);
}
return outValue;
}
private string GetPlanogramStatusListString()
{
return GetEnumListString<PogStoreData.PlanogramStatusCode>(this.POGSelectedStatusList);
}
private string GetMoveStatusListString()
{
return GetEnumListString<PogStoreData.POGMovedStatus>(this.POGMovedStatus);
}
它编译,并产生与原始代码相同的输出。
答案 1 :(得分:1)
由于将对象列表转换为整数字符串列表并不直接与类绑定,因此可以对此类逻辑使用扩展方法。虽然利益受到对象类型的限制。
另外,你在这里做的实际上是Map / Filter / Reduce。这意味着您可以稍微缩短代码并使用标准LINQ名称进行这些操作。 (Map / Filter / Reduce转换为.Net Select / Where / Aggregate)
public static string ToIntegers<T>(this IEnumerable<object> values) where T : struct
{
return values?.Select(x => {
T enumValue;
return Enum.TryParse(x.ToString(), out enumValue) ? Convert.ToInt32(enumValue).ToString() : null;
})
.Where(x => x != null)
.Aggregate((s1, s2) => s1 + "," + s2);
}
LINQ跨越方便和不可读之间的界限是个人品味的问题。对于习惯于“地图/过滤/减少”的人来说,这可能非常容易阅读,而其他人则不是这样。我只想提供一些其他输入,因为目前的答案非常相似。
答案 2 :(得分:0)
这样的东西?
private string GetsListString<T>(List<object> list)
{
string outValue = null;
if (list != null)
{
outValue = "";
// Parse the string list to get enum values into a list
List<string> tempStatusList = new List<string>();
foreach (object sts in list)
{
T enumValue;
if (Enum.TryParse<T>(sts.ToString(), out enumValue))
{
tempStatusList.Add(((int)enumValue).ToString());
}
}
outValue = string.Join(",", tempStatusList);
}
return outValue;
}
答案 3 :(得分:0)
您可以使用类似于以下代码的内容,
private string GetMoveStatusListString<T>(IEnumerable list) where T : struct
{
string outValue = null;
if (list != null)
{
outValue = "";
// Parse the string list to get enum values into a list
List<string> tempStatusList = new List<string>();
foreach (object sts in list)
{
T enumValue;
if (Enum.TryParse<T>(sts.ToString(), out enumValue))
{
tempStatusList.Add(enumValue.ToString());
}
}
outValue = string.Join(",", tempStatusList);
}
return outValue;
}
答案 4 :(得分:0)
单行代码就足够了:
string GetStatusList(IEnumerable<object> array)
{
return string.Join(",", array.Select((e)=>(Convert.ToInt32(e)).ToString()) );
}
用作
// GetPlanogramStatusListString();
var x=GetStatusList(POGSelectedStatusList.ToArray());
// 1,2,2
// GetMoveStatusListString();
var y=GetStatusList(POGMovedStatus.ToArray());
// 2,3,2,1,2