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。