C# 使用linq动态比较两个对象列表
我有一个雇员班C# 使用linq动态比较两个对象列表,c#,asp.net,linq-to-sql,C#,Asp.net,Linq To Sql,我有一个雇员班 public class Employee { public int ID { get; set; } public string Name { get; set; } public string Age { get; set; } public string Address { get; set; } public string ContactNo { get; set; } }
public class Employee
{
public int ID { get; set; }
public string Name { get; set; }
public string Age { get; set; }
public string Address { get; set; }
public string ContactNo { get; set; }
}
并有填充方法来填充列表
private static void FillEmployeeList(ref List<Employee> lt1, ref List<Employee> lt2)
{
lt1 = new List<Employee> {new Employee{ID=1,Name="Kavya",Age="24",Address="No.1,Nehru Street,Chennai",ContactNo="9874521456"},
new Employee{ID=2,Name="Ravi",Age="24",Address="Flat No.25/A1,Gandhi Street,Chennai",ContactNo="9658745258"},
new Employee{ID=3,Name="Lavnya",Age="30",Address="No.12,Shastri nagar,Chennai",ContactNo="5214587896"},
new Employee{ID=4,Name="Rupa",Age="31",Address="No.23/5,Nehru Street,Chennai",ContactNo="9874521256"},
new Employee{ID=5,Name="Divya",Age="32",Address="No.1/227,Nehru Street,Chennai",ContactNo="8541256387"},
};
lt2 = new List<Employee> {new Employee{ID=1,Name="Kavya",Age="24",Address="No.1,Nehru Street,Chennai",ContactNo="9874521456"},
new Employee{ID=2,Name="Ravindran",Age="30",Address="Flat No.25/A1,Gandhi Street,Chennai",ContactNo="9658745258"},
new Employee{ID=3,Name="Chandru",Age="30",Address="No.12,Shastri nagar,Chennai",ContactNo="5214587896"},
new Employee{ID=4,Name="Rakesh",Age="32",Address="No.23/5,Nehru Street,Chennai",ContactNo="9874021256"},
new Employee{ID=5,Name="Suresh",Age="32",Address="No.1/227,Nehru Street,Chennai",ContactNo="8541056387"},
new Employee{ID=11,Name="Suryakala",Age="28",Address="No.1,Pillayar koil Street,Chennai",ContactNo="9541204782"},
new Employee{ID=12,Name="Thivya",Age="41",Address="No.42,Ellaiamman koil Street,Chennai",ContactNo="9632140874"},
};
}
private static void FillEmployeeList(参考列表lt1,参考列表lt2)
{
lt1=新名单{新员工{ID=1,Name=“Kavya”,Age=“24”,Address=“钦奈尼赫鲁街1号”,ContactNo=“9874521456”},
新员工{ID=2,Name=“Ravi”,Age=“24”,Address=“金奈甘地街25/A1号公寓”,ContactNo=“9658745258”},
新员工{ID=3,Name=“Lavnya”,Age=“30”,Address=“第12号,Shastri nagar,钦奈”,ContactNo=“5214587896”},
新员工{ID=4,Name=“Rupa”,Age=“31”,Address=“钦奈尼赫鲁街23/5号”,ContactNo=“9874521256”},
新员工{ID=5,Name=“Divya”,Age=“32”,Address=“钦奈尼赫鲁街1/227号”,ContactNo=“8541256387”},
};
lt2=新名单{新员工{ID=1,Name=“Kavya”,Age=“24”,Address=“钦奈尼赫鲁街1号”,ContactNo=“9874521456”},
新员工{ID=2,Name=“Ravindran”,Age=“30”,Address=“金奈甘地街25/A1号公寓”,ContactNo=“9658745258”},
新员工{ID=3,Name=“Chandru”,Age=“30”,Address=“第12号,金奈沙斯特里纳加尔”,ContactNo=“5214587896”},
新员工{ID=4,Name=“Rakesh”,Age=“32”,Address=“钦奈尼赫鲁街23/5号”,ContactNo=“9874021256”},
新员工{ID=5,Name=“Suresh”,Age=“32”,地址=“钦奈尼赫鲁街1/227号”,联系方式=“8541056387”},
新员工{ID=11,Name=“Suryakala”,Age=“28”,Address=“钦奈皮拉亚尔库尔街1号”,ContactNo=“9541204782”},
新员工{ID=12,Name=“Thivya”,Age=“41”,Address=“钦奈埃利亚曼·科尔街42号”,ContactNo=“9632140874”},
};
}
比较两个对象列表
protected List<Employee> ListCompare(List<Employee> lt1, List<Employee> lt2)
{
FillEmployeeList(ref lt1, ref lt2);
List<Employee> lst = new List<Employee>();
if (lt1.Count > 0 && lt2.Count > 0)
{
// Displaying Matching Records from List1 and List2 by ID
var result = (from l1 in lt1
join l2 in lt2
on l1.ID equals l2.ID
orderby l1.ID
select new
{
ID = l1.ID,
Name = (l1.Name == l2.Name) ? "$" : (l2.Name + " (Modified)"),
Age = (l1.Age == l2.Age) ? "$" : (l2.Age + " (Modified)"),
Address = (l1.Address == l2.Address) ? "$" : (l2.Address + " (Modified)"),
ContactNo = (l1.ContactNo == l2.ContactNo) ? "$" : (l2.ContactNo + " (Modified)")
}).ToList();
// Displaying Records from List1 which is not in List2
var result1 = from l1 in lt1
where !(from l2 in lt2
select l2.ID).Contains(l1.ID)
orderby l1.ID
select new
{
ID = l1.ID,
Name = " Deleted",
Age = " Deleted",
Address = " Deleted",
ContactNo = " Deleted"
};
// Displaying Records from List1 which is not in List2
var result2 = from l1 in lt2
where !(from l2 in lt1
select l2.ID).Contains(l1.ID)
orderby l1.ID
select new
{
ID = l1.ID,
Name = l1.Name + " (Added)",
Age = l1.Age + " (Added)",
Address = l1.Address + " (Added)",
ContactNo = l1.ContactNo + " (Added)"
};
var res1 = result.Concat(result1).Concat(result2);
foreach (var item in res1)
{
Employee emp = new Employee();
//Response.Write(item + "<br/>");
emp.ID = item.ID;
emp.Name = item.Name;
emp.Age = item.Age;
emp.Address = item.Address;
emp.ContactNo = item.ContactNo;
lst.Add(emp);
}
}
return lst;
}
受保护列表列表比较(列表lt1、列表lt2)
{
填写员工名单(参考lt1、参考lt2);
List lst=新列表();
如果(lt1.Count>0&<2.Count>0)
{
//按ID显示列表1和列表2中的匹配记录
var结果=(来自lt1中的l1
在lt2中加入l2
关于l1.ID等于l2.ID
orderby l1.ID
选择新的
{
ID=l1.ID,
Name=(l1.Name==l2.Name)?“$”:(l2.Name+”(已修改)”,
年龄=(l1.Age==l2.Age)?“$”:(l2.Age+”(已修改)”,
地址=(l1.Address==l2.Address)?“$”:(l2.Address+”(已修改)”,
ContactNo=(l1.ContactNo==l2.ContactNo)?“$”:(l2.ContactNo+”(已修改)”
}).ToList();
//显示列表1中不在列表2中的记录
var result1=来自lt1中的l1
哪里!(从lt2中的l2开始)
选择l2.ID).Contains(l1.ID)
orderby l1.ID
选择新的
{
ID=l1.ID,
Name=“已删除”,
Age=“已删除”,
Address=“已删除”,
ContactNo=“已删除”
};
//显示列表1中不在列表2中的记录
var result2=来自lt2中的l1
其中!(从lt1中的l2开始)
选择l2.ID).Contains(l1.ID)
orderby l1.ID
选择新的
{
ID=l1.ID,
Name=l1.Name+“(已添加)”,
年龄=l1.年龄+“(添加)”,
地址=l1。地址+“(已添加)”,
ContactNo=l1.ContactNo+(新增)
};
var res1=result.Concat(result1).Concat(result2);
foreach(res1中的var项)
{
员工emp=新员工();
//响应。写入(项+“
”);
emp.ID=item.ID;
emp.Name=项目名称;
emp.Age=项目年龄;
emp.Address=项目地址;
emp.ContactNo=项目.ContactNo;
第一次增补(环境管理计划);
}
}
返回lst;
}
这里我调用compareList方法并返回结果并将其显示在html表中
List<Employee> lt1 = new List<Employee>();
List<Employee> lt2 = new List<Employee>();
List<Employee> resultset = new List<Employee>();
//string value = "ID";
StringBuilder htmlTable = new StringBuilder();
htmlTable.Append("<table border='1'>");
htmlTable.Append("<tr><th>ID</th><th>Name</th><th>Age</th><th>Address</th><th>ContactNo</th></tr>");
resultset = ListCompare(lt1, lt2);
foreach(var item in resultset)
{
htmlTable.Append("<tr>");
htmlTable.Append("<td>" + item.ID + "</td>");
htmlTable.Append("<td>" + item.Name + "</td>");
htmlTable.Append("<td>" + item.Age + "</td>");
htmlTable.Append("<td>" + item.Address + "</td>");
htmlTable.Append("<td>" + item.ContactNo + "</td>");
htmlTable.Append("</tr>");
}
htmlTable.Append("</table>");
PlaceHolder1.Controls.Add(new Literal { Text = htmlTable.ToString() });
List lt1=新列表();
列表lt2=新列表();
列表结果集=新列表();
//string value=“ID”;
StringBuilder htmlTable=新的StringBuilder();
htmlTable.Append(“”);
htmlTable.Append(“IDNameAgeAddressContactNo”);
结果集=列表比较(lt1,lt2);
foreach(结果集中的变量项)
{
htmlTable.Append(“”);
htmlTable.Append(“+item.ID+”);
htmlTable.Append(“+item.Name+”);
htmlTable.Append(“+item.Age+”);
htmlTable.Append(“+item.Address+”);
htmlTable.Append(“+item.ContactNo+”);
htmlTable.Append(“”);
}
htmlTable.Append(“”);
占位符1.Controls.Add(新文本{Text=htmlTable.ToString()});
我的问题是如何推广这种编码。我可以有任何课程(如员工或学生)。我只需要编码,我会将两个对象列表传递给CompareMethod(ToCompareMethod
protected List<TResult> ListCompare<TKey, TInput, TResult>(List<TInput> lt1, List<TInput> lt2, Func<TInput, TKey> key, Func<TInput, TInput, TResult> modified, Func<TInput, TResult> added, Func<TInput, TResult> deleted)
{
// Displaying Matching Records from List1 and List2 by ID
var matchingEmployees = lt1.Join(lt2, key, key, modified);
// Displaying Records from List1 which is not in List2
var lt1NotInlt2 = lt1
.Where(e1 => !lt2.Any(e2 => key(e2).Equals(key(e1))))
.Select(deleted);
// Displaying Records from List2 which is not in List1
var lt2NotInlt1 = lt2
.Where(e2 => !lt1.Any(e1 => key(e1).Equals(key(e2))))
.Select(added);
return matchingEmployees.Concat(lt1NotInlt2).Concat(lt2NotInlt1).ToList();
}
protected List<TResult> ListCompare<TInput, TResult>(List<TInput> lt1, List<TInput> lt2, Func<TInput, TInput, TResult> modified, Func<TInput, TResult> added, Func<TInput, TResult> deleted)
{
// Displaying Matching Records from List1 and List2 by ID
var matchingEmployees = lt1
.Where(e1 => lt2.Any(e2 => e2.Equals(e1)))
.Select(e1 =>
{
var e2 = lt2.First(e => e.Equals(e1));
return modified(e1, e2);
});
// Displaying Records from List1 which is not in List2
var lt1NotInlt2 = lt1
.Where(e1 => !lt2.Any(e2 => e2.Equals(e1)))
.Select(deleted);
// Displaying Records from List2 which is not in List1
var lt2NotInlt1 = lt2
.Where(e2 => !lt1.Any(e1 => e1.Equals(e2)))
.Select(added);
return matchingEmployees.Concat(lt1NotInlt2).Concat(lt2NotInlt1).ToList();
}
var result = ListCompare<int, Employee, Employee>(
lt1,
lt2,
e => e.ID,
(e1, e2) => new Employee
{
ID = e1.ID,
Name = (e1.Name == e2.Name) ? "$" : (e2.Name + " (Modified)"),
Age = (e1.Age == e2.Age) ? "$" : (e2.Age + " (Modified)"),
Address = (e1.Address == e2.Address) ? "$" : (e2.Address + " (Modified)"),
ContactNo = (e1.ContactNo == e2.ContactNo) ? "$" : (e2.ContactNo + " (Modified)")
},
e => new Employee
{
ID = e.ID,
Name = e.Name + " (Added)",
Age = e.Age + " (Added)",
Address = e.Address + " (Added)",
ContactNo = e.ContactNo + " (Added)"
},
e => new Employee
{
ID = e.ID,
Name = " Deleted",
Age = " Deleted",
Address = " Deleted",
ContactNo = " Deleted"
});