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

Rya*_*yan 1 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 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" });
        }
Run Code Online (Sandbox Code Playgroud)

因此,如果有一个名为"bar"的公共服务,我如何循环遍历此列表,获取每个唯一的计算机名称,然后将该计算机名称和服务添加到列表中?

Ahm*_*eed 5

您可以使用一些LINQ:

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

或者,您可以Select使用新对象向项目添加另一个,然后通过List.AddRange以下方式添加它们:

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

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