我有员工列表,其中每个Employee包含属性EmpId,EmpName,PathSuffix.PathSuffix列包含值EmpPart1.lst,EmplPart2.lst,Emp3456.lst,EmpPart3.lst,Emp5667.lst ....
所以,现在我的问题是如何根据pathsuffix列消除员工中的重复项,这样我的最终列表只包含EmpPart1.lst,Emp3456.lst,Emp5667.lst ....(即删除所有部分文件除了一个)。
如何实现这一目标?
输入: 列出每个文件包含FileName& FilePath.SomePath的一些以Part1,Part2,Part3结尾。其中一些不包含任何部分。我的要求只需要一个部分文件,即高一部分(下面的SourcePart3)
**FileName FilePath**
Test1.doc SourcePart1.lst
Test2.doc SourcePart2.lst
Test3.doc SourcePart3.lst
Test4.doc Event.lst
Test5.doc CallPart1.lst
Test6.doc CallPart2.lst
**Desired Output:**
**FileName FilePath**
Test3.doc SourcePart3.lst
Test4.doc Event.lst
Test6.doc CallPart2.lst
答案 0 :(得分:2)
让我们首先创建我们自己的IEqualityComparer<Employee>
来比较我们的实体,并确定它们是否重复。
public class EmployeeComparer : IEqualityComparer<Employee>
{
public bool Equals(Employee x, Employee y)
{
return String.Equals(x.PathSuffix, y.PathSuffix);
}
public int GetHashCode(Employee obj)
{
return obj.PathSuffix.GetHashCode();
}
}
假设您有以下列表:
List<Employee> employees;
只需拨打IEnumerable(T).Distinct(T)
即可List<Employee> uniqueEmployees = employees.Distinct(new EmployeeComparer()).ToList();
答案 1 :(得分:0)
解决这个问题的一般逻辑流程是第一次
选择第一个员工,将其路径后缀保存到变量,按顺序循环遍历列表,删除具有相同路径后缀值的任何其他员工。然后再增加到下一位员工,然后重复。
此外,在将员工插入列表时通常更容易检查重复项,但我没有您的代码我不确定您希望如何执行此操作。
答案 2 :(得分:0)
我会创建一个Dictionary<string, Employee>
。循环遍历列表一次,使用ContainsKey检查字典,如果返回true,则继续,如果不是,则调用duct.Add(employee.PathSuffix, employee);
然后使用dict.Values.ToList()
答案 3 :(得分:0)
我会重新考虑如何存储您的数据。我会将路径数据放入List。
员工对象:
public class Employee
{
public int EmpId { get; set; }
public string EmpName { get; set; }
public List<string> PathSuffix { get; set; }
public Employee(int ID, string Name, string PathCSV)
{
EmpId = ID;
EmpName = Name;
PathSuffix = new List<string>();
foreach (string path in PathCSV.Split(','))
{
if (string.IsNullOrEmpty(path) == false && path.Trim().Length > 0)
{
if (PathSuffix.Exists(x => x.ToLower() == path.Trim().ToLower()) == false)
{
PathSuffix.Add(path.Trim());
}
}
}
}
}
员工对象的样本
protected void Page_Load(object sender, EventArgs e)
{
List<Employee> MyEmployees = new List<Employee>();
MyEmployees.Add(new Employee(1, "User 1", "Path1,Path1,Path2,Path2,Path2,Path3"));
Response.Write("Employee 1 Information:<br />");
WriteEmployeeToScreen(MyEmployees[0]);
}
protected void WriteEmployeeToScreen(Employee ThisEmployee)
{
System.Text.StringBuilder paths = new System.Text.StringBuilder();
Response.Write(string.Format(
"{1} ({0})<br />",
ThisEmployee.EmpId,
HttpUtility.HtmlEncode(ThisEmployee.EmpName)));
foreach (string path in ThisEmployee.PathSuffix)
{
paths.Append(string.Format(", {0}", path));
}
if (paths.Length > 0)
{
Response.Write(string.Format("Paths: {0}", paths.ToString().Substring(2)));
}
}
输出:
Employee 1 Information:
User 1 (1)
Paths: Path1, Path2, Path3