2011-01-21 2 views
1

다음 코드를 고려하면 루프를 사용하여 각 고유 시스템에 공통 서비스를 추가 할 수 있습니다.루프를 사용하여 목록에서 고유 한 값을 가져온 다음 다른 값을 추가하십시오.

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" }); 
     } 

그래서 "바"라는 공통의 서비스가 존재하는 경우, 어떻게 내가이 목록 철저한 루프, 다음 각각의 고유 한 컴퓨터 이름을 얻을 목록에 해당 머신의 이름과 서비스를 추가?

+0

당신은 정적 목록에 추가하는 GetXX 방법이에게 있습니다 ? 오타를 수정하고 (Mc/Md) 예제를 완성하십시오. –

+0

Youre 맞아, 고마워. – Ryan

답변

5

당신은 몇 가지 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); 

일반적으로 쿼리는 다른 소스에 대한 것이지만이 경우에는 같은 목록을 쿼리하기 때문에 LINQ의 일반적인 지연된 (지연된) 실행 대신 ToArray() 또는 ToList()을 사용하여 쿼리를 즉시 실행해야합니다. 그렇지 않으면 컬렉션에 쿼리가 있고 쿼리 원본도 수정되기 때문에 InvalidOperationException으로 실행됩니다.

+0

나는 이것과 매우 비슷한 것을 가지고 있었지만 임은 invalidOperationException을 얻지 못함이 처리되지 않았다. - 콜렉션이 수정되었다; 열거 연산이 실행되지 않을 수 있습니다. – Ryan

+1

@Farstucker 좋은 캐치. 이 문제를 해결하는 한 가지 방법은 쿼리 끝에 ToArray()를 추가하는 것입니다. 문제는 쿼리가 지연되고 우리가 쿼리를 추가하는 동안 수정된다는 것입니다. 업데이트됩니다. –

+1

LINQ는 Lazy이므로이 "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); 
} 
0

이 당신을 위해 작동 한 후 .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; 
} 
관련 문제