2013-10-31 2 views
1

나는이 같은 CSV에서 사용자를 읽어 새로운 목록을 (목록)을 사용 후 참조로 전달됩니다 목록은 여전히 ​​내 컨트롤러에서

var users = Utilities.GetUsersFromCSV(path, userType, course); 

이는 CSV 파일을 읽고 그것으로 User 객체를 구축합니다. [사용자가 CSV 파일에서 작성된 후 나는이 같은 데이터베이스에 추가 할

public static List<User> GetUsersFromCSV(string filepath, string userType, Course course) { 
    var users = new List<User>(); 
    var user = new User(); 
    GeneratePassword(ref user); 
    return users; 
} 

private static void GeneratePassword(ref User user) { 
    var size = Rand.Value.Next(0, 3) + 8; 
    var sb = new StringBuilder(); 

    var shuffledlist = Chars.OrderBy(a => Guid.NewGuid()).ToList(); 

    for (var i = 0; i < size; i++) { 
      sb.Append((char) shuffledlist[i]); 
    } 

    user.Password = sb.ToString(); 
} 

:

_userRepository.AddUsers(Utilities.HashPasswords(users)); 

를 호출 한 가능성 관련 부분은 암호의 창조
public static List<User> HashPasswords(List<User> users) { 
    var newList = new List<User>(users); 
    foreach (var user in newList) { 
     user.Password = CalculateSha1Hash(user.Password, user.Login); 
    } 

    return newList; 
} 

this에 따르면 리포지토리에 전송되는 사용자 목록에 해시 된 암호가 포함되어야한다고 대답하고 users 목록에는 m y 컨트롤러에는 원래 비밀번호가 있어야합니다. 그러나 디버깅하는 동안 나는 HashPasswordsusers의 암호에 영향을 미칩니다.

이 문제의 원인은 무엇입니까?

+0

참조 유형에 대한 참조 사본이 메소드에 전달되는 것과 동일합니다. 그러나이 참조는 여전히 동일한 데이터를 가리 킵니다. 이것을 피하려면 객체 사본을 만들어이 사본을 전달해야합니다. 이것은 게시 한 링크에도 명시되어 있습니다. '목록 자체를 복사하려면 List 에 편리한 생성자가 있으며 이는 IEnumerable 을 사용합니다. '. – user1567896

+0

코드가 컴파일되지 않습니다. GetUsersFromCSV 메서드는 값을 반환하지 않습니다. – helb

+0

@ user1567896 : 그게 뭔지'var newList = 새 목록 (사용자);'무엇입니까? @helb : 분명히 코드의 큰 부분을 버렸습니다. 모든 것이 컴파일됩니다. 그냥 명확하게 편집하겠습니다. –

답변

4

newList 개체는 얕은 사본입니다. Linq Select을 원본 목록에 사용하여 전체 복사본을 만듭니다.

newList = users.Select(u => CopyAndChangePassword(u)); 
+0

건배, 해결되었습니다! 이제 완벽하게 작동합니다. –