【问题标题】:using a loop get unique values form a list then add another value使用循环从列表中获取唯一值,然后添加另一个值
【发布时间】:2011-06-13 07:28:33
【问题描述】:

考虑以下代码,是否可以使用循环为每台唯一的机器添加公共服务。

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”的通用服务,我如何遍历这个列表,获取每个唯一的机器名称,然后将该机器名称和服务添加到列表中?

【问题讨论】:

  • 您有添加到静态列表的 GetXX 方法吗?更好地修正错别字(Mc/Md)并完成示例:应该发生什么?

标签: c# generics collections loops c#-4.0


【解决方案1】:

如果您使用的是 .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;
}

【讨论】:

    【解决方案2】:

    你可以使用一些 LINQ:

    var query = Mc.Select(m => m.Machine).Distinct().ToArray();
    foreach (string m in query)
        Mc.Add(new MyClass { Machine = m, Service = "bar" });
    

    或者,您可以添加另一个 Select 以使用新对象进行投影,然后通过 List.AddRange 添加它们:

    var query = Mc.Select(m => m.Machine)
                  .Distinct()
                  .Select(m => new MyClass { Machine = m, Service = "bar" })
                  .ToArray();
    Mc.AddRange(query);
    

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

    【讨论】:

    • 我确实有一些与此非常相似的东西,但我得到一个 invalidOperationException 未处理 - 集合已修改;枚举操作可能无法执行。
    • @Farstucker 不错。解决此问题的一种方法是在查询末尾添加ToArray()。问题是查询被延迟并且在我们添加时正在修改。会更新。
    • 那是因为 LINQ 是惰性的,当你枚举这样的查询“Mc.Select(m => m.Machine).Distinct()”时,它会保存 Mc 的枚举器,直到你释放它以枚举结束。因此,您应该通过将其转换为数组或列表来强制查询:Mc.Select(m => m.Machine).Distinct().ToArray()。
    【解决方案3】:

    这可能会有所帮助..

    var result = list.Select(x=>x.Service).Distinct(); 
    forearch(MyClass cls in result)
    {
         collection_of_myclass.add(cls);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-08
      • 1970-01-01
      • 2018-08-05
      • 2023-02-01
      相关资源
      最近更新 更多