0

이 질문에는 이미 답변이 있습니다.

나는 다음을 추가하려고 노력 중이다.SELECT ALL기능을 사용하여 LINQ 내 눈금,하지만 컴파일 오류가 발생합니다.

List<Person_> PeopleUpdated = People.ToList().ForEach(a => a.SELECTED = true).ToList();

그것은 말한다 :

암시 적으로 'void'유형을 다음으로 변환 할 수 없습니다.   'System.Collections.Generic.List <   LogoSapHrIntegration.frmXmlUpload.Person_> '

내가 뭘 잘못하고 있죠?


  • 무엇이 잘못 되었나요?foreach(var p in People) p.SELECTED = true;? - Rango
  • People이다IEnumerable? - Yuval Itzchakov
  • 너 각각 바꿀거야?person' SELECTED 필드 / 속성을 선택하거나 필터 만 보내려고합니까?SELECTED사람들. 그 후자의 경우, 그냥.Where(a => a.SELECTED) - StuartLC
  • 무엇입니까PeopleUpdated들어 있어야한다고? - 선택한 모든 사람들의 목록 또는 선택하도록 업데이트 된 사람들의 목록 (즉, 이미 선택되지 않은 사람). 아니면 그냥 실수일까요? - Jon Egerton

4 답변


4

그만큼List<T>.ForEach반환 값 (즉, void)이 없으므로 실행할 수 없습니다.ToList()그 반대. (만나다MSDN)

ForEach목록의 각 항목에 대한 특정 작업 (실제 작업for고리).

귀하의 경우에는 모든 루프를 선택하는 간단한 for 루프가 가장 효율적입니다.

foreach (var person in People)
    person.Selected = true


  • OP가 모든 사람을 업데이트하려는 경우People평야foreach루프가 훨씬 간단하고 효율적입니다. - Rango
  • @ TimSchmelter : 합의 - 비록 그 운 좋은 비트가PeopleUpdated동시에 목록. OP는 이것이 한 - 라이너가되기를 바라고 있으며 그것이 될 수 있는지 확신 할 수 없습니다. - Jon Egerton
  • 이 항목을 "한 줄짜리"라고하지 않았습니다.foreach(var p in People) p.SELECTED = true;? 제목에 따르면 OP는 원래 목록을 업데이트하려고하지만 새 목록을 만들어야하는 것은 아닙니다. - Rango
  • 얘들 아, 그가하고 싶은 일이 완전히 명확하지 않다는 것이다. - Leo
  • @ 레오 왜 명확하지 않은가요? 그것은 나에게 아주 분명하다. OP가 컬렉션을 반복 설정 중입니다.Selected사실로. - Yuval Itzchakov

1

List<T>.ForEach보고void(귀하의 경우 컬렉션이 제자리에서 컬렉션을 변경합니다).ForEach걸린다Action<T>목록의 각 항목에 대해 실행합니다.

만나다List (T) .ForEach on MSDN


  • 누가 그것을 downvoted 모르겠다. - Leo

0

우선, 정상을 사용할 수 있습니다.foreach고리:

foreach (var person in people)
{
   person.Selected = true;
}

어느 것이 가장 간단하고 깨끗합니다.

정말로 농구로 뛰어 가서 LINQ를 사용하려면ConvertAll:

var list = new List<Person> { new Person(), new Person() };
var convertedPeople = list.ConvertAll(person => 
{
    person.Selected = true;
    return person;
});


  • 사용자가 목록 수정을 시도하지 않았다고 생각합니다. "                 - Leo
  • @ 레오 글쎄, 만약 당신이Select all기능을 사용하고 싶지는 않습니다.세트모든Selected속성true? - Yuval Itzchakov

0

그만큼ForEeach메서드 (LINQ가 아님)는 목록의 각 항목에 대해 작업을 실행하지만 목록에서 항목을 필터링하는 데 사용되지 않으므로 결과를 반환하지 않습니다.

각 항목에 대해 메소드를 실행하십시오. 할당 할 결과가 없습니다.

People.ToList().ForEach(a => a.SELECTED = true);

속성이 변경된 항목의 새 목록을 원하면 항목을 복제하여 원본과 분리해야합니다.

List<Person_> PeopleUpdated = People.ToList().Select(a => {
  Person_ b = a.Clone();
  b.SELECTED = true;
  return b;
}).ToList();

(클래스가 복제를 지원하지 않는 경우, 클래스를 구현해야합니다.Clone방법 (및 바람직하게는IClonable인터페이스).)


  • 왜 아이템을 복제해야합니까? - Magnus
  • @Magnus : 변경된 값으로 새 목록을 원할 경우 그렇게해야합니다. 그렇지 않으면 원래 목록의 항목도 변경됩니다. - Guffa
  • 나는 이것이 핵심이라고 생각할 것이다. - Magnus
  • @Magnus : 어쩌면 아마도 그렇지 않을 수도 있습니다. 원래 코드에는 결과로 새로운 목록이 있었고, 결과를 생성하는 데 필요한 코드를 추가하는 코드를 추가했습니다. - Guffa

연결된 질문


관련된 질문

최근 질문