我有以下代码,我想以最少代码行的方式编写它,并且工作以相同的方式完成。我怎样才能做到这一点?
List<Category> categoryList = new List<Category>();
categoryList = Category.LoadForProject(project.ID).ToList();
List<string> categories = new List<string>(Categories);
IList<Category> currentCategories = Category.LoadForProject(project.ID).ToList();
if (currentCategories != null)
{
foreach (var existingCategories in currentCategories)
{
if (categories.Contains(existingCategories.Name))
categories.Remove(existingCategories.Name);
else
existingCategories.Delete(Services.UserServices.User);
}
foreach (string item in categories)
{
Category category = new Category(project, item.ToString());
category.Project = project;
category.Save();
}
}
List<string> priorities = new List<string>(Priorities);
IList<Priority> currentPriorities = Priority.LoadForProject(project.ID).ToList();
if (currentPriorities != null)
{
foreach (var existingPriorities in currentPriorities)
{
if (priorities.Contains(existingPriorities.Name))
priorities.Remove(existingPriorities.Name);
else
existingPriorities.Delete(Services.UserServices.User);
}
foreach (string item in priorities)
{
Priority priority = new Priority(project, item.ToString());
priority.Project = project;
priority.Save();
}
}
像这样的事情应该这样做:
public IList<T> DoYourThing<T>(IList<T> items, IList<T> currentItems, Project project) where T : CommonBaseType
{
if (currentItems != null)
{
foreach (var existingItem in currentItems)
{
if (items.Contains(existingItem.Name))
items.Remove(existingItem.Name);
else
existingItems.Delete(Services.UserServices.User);
}
foreach (string item in items)
{
T newItem = Activator.CreateInstance(typeof(T), new object[] {project, item.ToString()}) as T;
newItem.Project = project;
newItem.Save();
}
}
return currentItems;
}
然后你可以这样调用它:
var currentCategories = DoYourThing(Categories.ToList(), Category.LoadForProject(project.ID).ToList());
var currentProjects = DoYourThing(Priorities.ToList(), Priority.LoadForProject(project.ID).ToList());
最后,有两点需要特别注意:
首先,函数有一个通用条件where T : CommonBaseType
。我假设类别和项目有一个共同的基本类型或接口,其中包括名称。如果没有,您应该摆脱该条件并使用 Dynamic 来获取 Name。
其次,我使用 Activator.Create 为您创建该类。这是一个棘手的部分,如果你不知道这个技巧,就很难弄清楚
祝你好运!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)