C# 使用循环从列表中获取唯一值,然后添加另一个值

C# 使用循环从列表中获取唯一值,然后添加另一个值,c#,generics,collections,loops,c#-4.0,C#,Generics,Collections,Loops,C# 4.0,考虑到以下代码,可以使用循环向每个唯一的机器添加公共服务 internal static List<MyClass> Mc = new List<MyClass>(); public class MyClass : OtherClass { public string Machine { get; set; } public string Service { get; set; } public void Add

考虑到以下代码,可以使用循环向每个唯一的机器添加公共服务

internal static List<MyClass> Mc = new List<MyClass>();

public class MyClass : OtherClass
    {
        public string Machine { get; set; }
        public string Service { get; set; }

        public void AddProcessDetails()
        {
            Mc.Add(new MyClass { Machine = server1, Service = "notepad" });
            Mc.Add(new MyClass { Machine = server2, Service = "notepad" });
            Mc.Add(new MyClass { Machine = server2, Service = "foo" });
        }
因此,如果有一个名为“bar”的公共服务,我如何循环浏览此列表,获取每个唯一的机器名,然后将该机器名和服务添加到列表中?

这可能会有所帮助

var result = list.Select(x=>x.Service).Distinct(); 
forearch(MyClass cls in result)
{
     collection_of_myclass.add(cls);
}
这可能会有帮助

var result = list.Select(x=>x.Service).Distinct(); 
forearch(MyClass cls in result)
{
     collection_of_myclass.add(cls);
}
您可以使用一些LINQ:

var query = Mc.Select(m => m.Machine).Distinct().ToArray();
foreach (string m in query)
    Mc.Add(new MyClass { Machine = m, Service = "bar" });
或者,您可以将另一个选择添加到带有新对象的项目中,然后通过List.AddRange添加它们:

通常一个查询是针对另一个源的,但在这种情况下,由于我们查询的是同一个列表,因此您需要使用ToArray或ToList立即执行查询,而不是LINQ通常的延迟延迟执行。否则,您将遇到InvalidOperationException,因为集合正在查询,查询源也正在修改。

您可以使用一些LINQ:

var query = Mc.Select(m => m.Machine).Distinct().ToArray();
foreach (string m in query)
    Mc.Add(new MyClass { Machine = m, Service = "bar" });
或者,您可以将另一个选择添加到带有新对象的项目中,然后通过List.AddRange添加它们:


通常一个查询是针对另一个源的,但在这种情况下,由于我们查询的是同一个列表,因此您需要使用ToArray或ToList立即执行查询,而不是LINQ通常的延迟延迟执行。否则,您将遇到InvalidOperationException,因为集合正在查询,并且查询源也正在修改。

如果您使用的是.net 2.0,那么这将适用于您。。。下面是示例代码

protected void Page_Load(object sender, EventArgs e)
{

    Employee objEmp1 = new Employee("Rahul", "Software");
    Employee objEmp2 = new Employee("Rahul", "Software");
    Employee objEmp3 = new Employee("Rahul", "Back Office");
    Employee objEmp5 = new Employee("Rahul", "Back Office");
    Employee objEmp4 = new Employee("Rahul", "Engineer");
    Employee objEmp6 = new Employee("Rahul", "Engineer");
    Employee objEmp7 = new Employee("Rahul", "Test");

    List<Employee> lstEmployee = new List<Employee>();

    lstEmployee.Add(objEmp1);
    lstEmployee.Add(objEmp2);
    lstEmployee.Add(objEmp3);
    lstEmployee.Add(objEmp4);
    lstEmployee.Add(objEmp5);
    lstEmployee.Add(objEmp6);
    lstEmployee.Add(objEmp7);

    // TO GET THE GENERIC ITEMS
    List<Employee> lstDistinct = Distinct(lstEmployee);
}

public static List<Employee> Distinct(List<Employee> collection)
{
    List<Employee> distinctList = new List<Employee>();

    foreach (Employee value in collection)
    {
        if (!distinctList.Exists(delegate(Employee objEmp) { return objEmp.Designation == value.Designation; }))
        {
            distinctList.Add(value);
        }
    }

    return distinctList;
}

如果您使用的是.NET2.0,那么这将适用于您…下面是示例代码

protected void Page_Load(object sender, EventArgs e)
{

    Employee objEmp1 = new Employee("Rahul", "Software");
    Employee objEmp2 = new Employee("Rahul", "Software");
    Employee objEmp3 = new Employee("Rahul", "Back Office");
    Employee objEmp5 = new Employee("Rahul", "Back Office");
    Employee objEmp4 = new Employee("Rahul", "Engineer");
    Employee objEmp6 = new Employee("Rahul", "Engineer");
    Employee objEmp7 = new Employee("Rahul", "Test");

    List<Employee> lstEmployee = new List<Employee>();

    lstEmployee.Add(objEmp1);
    lstEmployee.Add(objEmp2);
    lstEmployee.Add(objEmp3);
    lstEmployee.Add(objEmp4);
    lstEmployee.Add(objEmp5);
    lstEmployee.Add(objEmp6);
    lstEmployee.Add(objEmp7);

    // TO GET THE GENERIC ITEMS
    List<Employee> lstDistinct = Distinct(lstEmployee);
}

public static List<Employee> Distinct(List<Employee> collection)
{
    List<Employee> distinctList = new List<Employee>();

    foreach (Employee value in collection)
    {
        if (!distinctList.Exists(delegate(Employee objEmp) { return objEmp.Designation == value.Designation; }))
        {
            distinctList.Add(value);
        }
    }

    return distinctList;
}

你有一个GetXX方法可以添加到一个静态列表中?最好修复键入Mc/Md并完成示例:应该发生什么?你有一个GetXX方法可以添加到一个静态列表中?最好修复键入Mc/Md并完成示例:应该发生什么?我确实有一些非常类似的东西,但我得到了一个InvalidoOperationException未经处理-集合已修改;枚举操作可能无法执行。@Farstucker很好。解决此问题的一种方法是在查询末尾添加数组。问题是,在我们添加到查询时,查询被延迟,并且正在被修改。将更新。这是因为当您像这样枚举查询时,LINQ是懒惰的。Selectm=>m.Machine.Distinct它将保存Mc的枚举数,并且在完成枚举之前不会释放它。因此,您应该通过将其转换为数组或列表来强制查询:Mc.Selectm=>m.Machine.Distinct.ToArray。我确实有类似的内容,但我收到一个invalidOperationException未处理-集合已修改;枚举操作可能无法执行。@Farstucker捕获得很好。解决此问题的一种方法是在查询末尾添加数组。问题是,在我们添加到查询时,查询被延迟,并且正在被修改。将更新。这是因为LINQ是惰性的,当您枚举类似于此Mc的查询时。Selectm=>m.Machine.Distinct它将保留Mc的枚举器,并且在完成枚举之前不要释放它。所以应该通过将其转换为数组或列表来强制查询:Mc.Selectm=>m.Machine.Distinct.ToArray。