2014-12-21 4 views
0

아직 초보자 그래서 나와 함께 맨발로주세요. 목록에서 중복 된 값을 구별 한 후 속성에 숫자 값을 추가하는 기능을 원합니다.어떻게 목록 내의 개체 속성에 값 추가 <>

예를 들어, 두 명의 사용자가 동일한 직원 ID 001을 가지고 있다고 입력하면 List는 둘 다 들어가서 어떤 중복이 있는지 확인하기 위해 조건을 적용하므로이 경우 . 이제이 조건부가 true 일 때 마지막 직원이 이제 직원 ID 002를 갖도록 해당 속성에 1을 추가합니다.

저는 LINQ가이 프로세스에 관련 될 가능성이 높지만이 작업을 수행하는 방법에 대해서는 확신하지 못합니다. 프로그램 전체에서 등록 정보 상태를 유지하기 위해이 작업을 수행 한 후에 내 목록을 업데이트해야한다는 것도 알고 있습니다. 사전에

덕분 질문은 다시 목록 아래 <>

코드 조각 내에서 속성에 값을 추가하는 방법, 모든 것이 분명하다 바랍니다.

Employee = new Employee(employeeFirstName, employeeLastName,001); // Hard coded for sake of example. 

EmployeeList.AddEmployee(Employee); 

에는 EmployeeList 클래스

public static void AddEmployee(Employee employee) 
{ 

    employees.Add(new Employee(employee.FirstName,employee.LastName,employee.EmployeeID)); 
    employees.Add(new Employee("John", "Jones", 001));  

} 

public void employeeIdValidation() 
{ 
    if (employees.Count() != employees.Select(x => new {staffId = x.EmployeeID }).Distinct().Count()) 
    { 
    Console.WriteLine("Every Book and Category should be unique"); 
    // employee ID increments by 1 
    // update List 

    } 
    else 
    { 
    Console.WriteLine("No duplicate found"); 
    } 
} 

public static List<Employee> GetEmployeeList() 
{ 
    return employees; // With the updated EmployeeID 
} 
+1

데이터를 저장하기 위해 백엔드로 무엇을 사용하고 있습니까? 일반적으로 ID는 사용자가 제공하지 않고 레코드가 삽입되면 데이터베이스 자체에서 제공됩니다. – TyCobb

+0

그냥 목록에 저장되어 있습니다. 그래, 나는이 프로그램에서 사용자와 완전히 동의하지만 사용자가 직접 제공합니다. – TheSmith

답변

1

는 종업원이 LINQ 기능을 사용할 수 있습니다 동일한 ID를 가지고있는 목록에서 찾을 수 있습니다.

var result=employees.ToLookup(e => e.Id); 

이렇게하면 동일한 ID를 가진 직원을 그룹화 할 수 있습니다. 나는 아래 보여 그런 다음, 동일한 ID를 가진 직원의 각 그룹에 대해 반복 할 수

foreach (IGrouping<int, Employee> group in result) 
{ 
    //More than 2 employees with the same Id 
    if (group.Count()>1) 
    { 
     foreach (Employee employee in group) 
     { 
      //Change your ids here 
     } 
    }   
} 

[업데이트 1] : 나는 당신이 반복 처리하기 전에 먼저 최대 ID를 찾을 수 proporse ID를 변경하려면 그룹. 아래 볼 수

int nextID = result.Max(e => e.Key)+1; 

그런 다음주기위한 에 대한 두 번째 foreach는주기를 변경합니다. 동일한 ID를 가진 두 개 이상의 종업원을 가진 그룹을 찾을 때, 첫 번째 요소를 변경하지 마십시오,이 방법에서 나머지 부분을 변경합니다

//The first element don't change the id, start for the second element 
for (int j = 1; j < group.Count(); j++) 
{ 
    var currentEmployee=group.ElementAt(j); 
    // Change the id and refresh the nextID variable 
    currentEmployee.Id = nextID++; 
} 
+0

감사합니다. 완벽 합니다만 어떻게 ID 속성을 변경하겠습니까? 다음을 시도했습니다. int value = 1; employee.EmployeeID + value; .. 분명히 운이 없다면, 내가 큰 방향이 될 것이라고 가르쳐 주실 수 있습니다. 미리 감사드립니다. – TheSmith

+0

업데이트를 확인하십시오. 1,이 도움이 되었기를 바랍니다. – octavioccl

+0

당신의 남자보다 다른 단어는 없습니다!나는 Enumerator를 얻고 마지막 메서드를 호출하여 객체의 마지막 속성 만 바꾸는 방법을 사용하려고했습니다. (올바른 대화를 배우는 의미가됨을 희망합니다) – TheSmith

2

IMHO, 당신은 사용해야합니다 Dictionary<int, Employee> (키가 어디 Id) 대신 list을 입력하십시오. 이렇게하면 컬렉션에 추가하기 전에 중복 레코드의 ID를 업데이트하고 모든 문제와 계산을 저장해야합니다.

+0

제안에 감사드립니다. 내가 여기있는 목록은 꽤 논리적 인 것처럼 확실히 앞으로 나아갈 사전을 사용할 것입니다. – TheSmith

+0

또한 성능을 위해 키를 통해 레코드를 찾는 것이 사전에서 훨씬 빠릅니다. –