从属性值中的C#.net中的List <t>中删除重复项

时间:2015-11-03 01:03:14

标签: c# collections

我有员工列表,其中每个Employee包含属性EmpId,EmpName,PathSuffix.PathSuffix列包含值EmpPart1.lst,EmplPart2.lst,Emp3456.lst,EmpPart3.lst,Emp5667.lst ....

所以,现在我的问题是如何根据pathsuffix列消除员工中的重复项,这样我的最终列表只包含EmpPart1.lst,Emp3456.lst,Emp5667.lst ....(即删除所有部分文件除了一个)。

如何实现这一目标?

输入: 列出每个文件包含FileName&amp; 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

4 个答案:

答案 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