2014-07-21 3 views
1

MVC 5 웹 애플리케이션을 개발 중입니다. 사용자가 그리드의 체크 박스를 체크하고 데이터를 데이터베이스에 저장하는 화면이 있습니다. 지금 구현해야하는 것은 사용자가 화면으로 다시 이동하여 항목 중 하나를 선택 취소하고 계속 한 경우 데이터 제거입니다. 나는 확실하지 않다리스트에있는 값과 다른 값을 비교하는 것

IEnumerable<string> splitSelectedCars = model.SelectedCars 
              .Split(',') 
              .Select(sValue => sValue.Trim()); 

if (cars.Count > 0) 
{ 
    IEnumerable<string> savedCarsInDb = cars.Select(c => c.Id).ToList(); 

    //var merged = splitSelectedCars.Union(savedCarsInDb ,) 

    //puesdo code - for each value in merged call service layer to remove 

} 

노동 조합을 사용하는 것이 가장 좋은 방법은에서 splitSelected 자동차 목록에있는 모든 값을 보려면 여기를 경우 아래로

그래서 내 컨트롤러의 코드는 지금까지 보인다 모델은 savedCarsInDb 목록에 없는데, 그렇다면 IEqualityComparer은 어떻게 생겼을까요?

예제 목록은 처음으로 1,2,3,4가 모델로 전달되어 분리되어 DB에 저장됩니다. 사용자가 뒤로 탐색하여 ID 4를 선택하면 splitSelected는 1,2,3을 가지며 savedCarsInDb는 여전히 1,2,3,4를 가지므로 '4'를 찾은 다음 제거를 호출해야합니다.

답변

1

LINQ가 도움이 될 수 있습니다. 당신이 케이스를할지 여부에 따라

var selected = model.SelectedCars.Split(',').Select(sValue => sValue.Trim()); 
var saved = cars.Select(c => c.Id).ToList(); 
var removed = saved.Except(selected); 

가 민감하거나하지 적절한 문자열 비교 자에 전달할 수 있습니다 : 여기, the Except method specificall

var removed = saved.Except(selected, StringComparer.OrdinalIgnoreCase); 
+0

감사 릭 -이 갈 줄 것이다 - 내가 추측 이미 D에있는 두 번째 자동차에 대해 Add가 호출되지 않도록하기 위해 비슷한 것을 사용할 수 있습니다. B (즉, 현재 - 사용자가 선택한 ID를 다시 탐색하면 db에 두 번 저장됩니다.) –

+0

@Ctrl_Alt_Defeat 집합 논리가 특정 문제를 해결하는 방법입니다. HashSet (http://msdn.microsoft.com/en-us/library/bb359438(v=vs.110).aspx) 트릭을 수행합니다. –

관련 문제