我创建了一种将SQLite数据库的数据分为3类的方法:
已删除(list_1中不再存在的list_2变量)
边注:list_2是list_1的备份,未经任何修改
此代码的问题是我只能在一个类上使用它。如果我想再上一堂课,那么我必须做些细微的改动来再次写下相同的代码。我现在有3节课,但是将来,我可能会想要更多。如果我尝试一遍又一遍地写每节课,那将是非常耗时的,因此我将这个问题发布给大家以提建议。同样是因为我没有找到任何使用lambda表达式的文章。
public class Stats
{
public int id { get; set; }
public string name { get; set; }
}
public class FactStats : Stats
{
public string tag { get; set; }
public float balance { get; set; }
public FactStats ShallowCopy()
{
return (FactStats)this.MemberwiseClone();
}
}
List<FactStats> Factions = new List<FactStats>();
List<FactStats> SavedFactions = new List<FactStats>();
void SavetoDatabase()
{
//1. Separate Data
List<FactStats> F_JoinedList = new List<FactStats>();
List<int> F_Modify = new List<int>();
List<int> F_Create = new List<int>();
List<int> F_Delete = new List<int>();
//Modified Objects
F_JoinedList = Factions.Where(n => SavedFactions.Any(o => o.id == n.id)).ToList();
foreach (FactStats f in F_JoinedList)
{
FactStats fs = SavedFactions.Single(x => x.id == f.id);
if (!f.CompareEquals(fs))
F_Modify.Add(f.id);
}
//Created Objects
foreach (FactStats f in Factions)
{
bool vane = Convert.ToBoolean(SavedFactions.Where(f2 => f2.id == f.id).Count());
if (!vane)
F_Create.Add(f.id);
}
//Deleted Objects
foreach (FactStats f in SavedFactions)
{
bool vane = Convert.ToBoolean(Factions.Where(f2 => f2.id == f.id).Count());
if (!vane)
F_Delete.Add(f.id);
}
...
}
我尝试着反思,但并没有太大的成功。可能是因为我缺乏经验。
CompareEquals扩展方法(在Modified Objects中)是第三方代码,它使用反射比较同一类的两个对象。
答案 0 :(得分:0)
在不同类上使用一种方法的最佳方法是使用泛型方法。由于类不同,因此它们应符合公共接口,例如IUniqueIdentifiable应该具有“ id”属性。 您需要创建方法:
void Save<T>(List<T> saved, List<T> modified) where T: IUniqueIdentifiable
{
List<T> F_JoinedList = new List<T>();
List<int> F_Modify = new List<int>();
List<int> F_Create = new List<int>();
List<int> F_Delete = new List<int>();
//Modified Objects
F_JoinedList = modified.Where(n => saved.Any(o => o.id == n.id)).ToList();
foreach (T f in F_JoinedList)
{
T fs = saved.Single(x => x.id == f.id);
if (!f.CompareEquals(fs))
F_Modify.Add(f.id);
}
//Created Objects
foreach (T f in modified)
{
bool vane = Convert.ToBoolean(saved.Where(f2 => f2.id == f.id).Count());
if (!vane)
F_Create.Add(f.id);
}
//Deleted Objects
foreach (T f in saved)
{
bool vane = Convert.ToBoolean(modified.Where(f2 => f2.id == f.id).Count());
if (!vane)
F_Delete.Add(f.id);
}
...
}
public interface IUniqueIdentifiable
{
id {get;}
}
有很多文章如何创建泛型方法,您可以在下面找到一个示例 http://www.informit.com/articles/article.aspx?p=605369&seqNum=4