2009-09-11 8 views
11

나는 linq 식 (선호 람다)을 사용하여 쉽게 델리게이트로 사용할 수 있도록 코드를 작성했습니다. 코드는 다음과 같습니다배열의 모든 값을 주어진 값으로 설정하는 Linq 식

내 인생
List<DateTime[]> changes = new List<DateTime[]>(); 
changes = PopulateChanges(); 
for (int i = 0; i < changes.Count; i++) 
{ 
    for(int j = 0; j < changes[i].Length; j++) 
    { 
     changes[i][j] = DateTime.MinValue; 
    } 
} 

, 나는이 일을 알아낼 수 없습니다. ForEach 및 다양한 형식의 선택 등을 사용해 보았습니다. 아무 것도 올바르게 작동하지 않는 것 같습니다.

FYI, DateTime의 기본값은 MinValue입니다. 실제로는 이미 설정 한 후에 배열을 기본값으로 지우고 있습니다.

작업 표현을 도와 줄 수있는 사람이 있습니까?

편집 :

내가 내가 정말 여기에서 말하고있는 것은 내가 주어진 값으로 다차원 배열의 모든 요소를 ​​설정하는 간결한 방법을 원하는 것 같다. 분명히 중첩 된 for 루프가 작동하고, 확실히 그것을 (이미 완료 한) 함수에 넣을 수 있습니다. 난 그냥 멀티 라인 괴물을 만들지 않고도 델리게이트에서보다 쉽게 ​​사용할 수있는 좀 더 간결한 것을 원한다.

답변

14

트릭을 수행해야합니다.

LINQ가 아니며 중첩 된 for 루프와 약간의 차이가 있습니다.

changes.ForEach(x => Array.Clear(x, 0, x.Length)); 

확실히 (AB)하는 방법과 동일한 결과를 달성하기 위해 LINQ를 사용할 수 있습니다,하지만 난 그 더러운 해킹 할 생각 하는데요. 게다가, LINQ 등가물은 위의 예제보다 덜 장황하지 않을 것입니다.

+0

나는 이것을 좋아한다. 나를 위해 충분히 가깝다고 생각합니다. –

2

LINQ는 실제로 컬렉션 업데이트에 사용하기위한 것이 아닙니다. 기존 컬렉션에 대한 열거 형을 쿼리하는 것입니다. 당신의 코드가 완벽하게 읽기 쉽고 많은 lambdas 등을 갖도록 강요한다면 훨씬 향상되지 않을 것이라고 생각합니다. 당신이 값으로 설정 한 각 요소와 새로운 List<DateTime[]>을 만들려면

, 당신은이 작업을 수행 할 수 있습니다

var changes = Enumerable.Range(0, width) 
         .Select(x => Enumerable.Range(0, height) 
               .Select(y => DateTime.MinValue) 
               .ToArray()) 
         .ToList(); 

당신이 정말ForEach/LINQ를 사용하고 싶은 경우에, 학대하는 것이 가능

changes.ForEach(array => array.Select((dt, i) => array[i] = DateTime.Now) 
           .LastOrDefault()); 
+0

나는 이것이 왜 의미가 없다고 말하는지 이해하지 못합니다. 데이터를 쿼리 한 다음 값을 업데이트하는 일반적인 Linq2SQL 쿼리에 대해 생각해보십시오. 이 점이 다른 점은 무엇입니까? –

+3

LINQ2SQL을 사용하면 데이터베이스를 쿼리 한 다음 반환 된 개체를 수정할 수 있습니다. 반환 된 모든 객체를 수정하려면 루프를 사용하여 객체를 반복해야합니다. 개체를 포함하는 열거 형은 전혀 수정되지 않습니다. LINQ는 쿼리를 업데이트하는 것이지 컬렉션을 업데이트하지 않습니다. – dtb

2

흥미로운 질문을하지만, Linq에 약 를 조회하고 여기서 뭐하는거야 : Select (하지만 난 그것을하지 않는 것이 좋습니다) 나에 대한 질의와 많이 흡사하지. 거기에 해결책이있다해도, 나는 이런 식으로 Linq를 사용할 것인지 확신하지 못한다.

+1

나는 그것이 실제로 쿼리이지만 부작용이있는 쿼리는 동의하지 않습니다. List 의 모든 요소를 ​​반환하도록 쿼리하고 있으므로 해당 값을 설정할 수 있습니다. Linof에서 Transofrmation을 투영하는 것과 같은 많은 쿼리가 있습니다. 어떻게 다른지는 모르겠습니다. –

+4

LINQ에는 쿼리 된 컬렉션을 수정하는 쿼리가 하나도 없습니다 (따라서 "쿼리"). – dtb

+0

원본을 수정하는 것은 없지만 그가 수행하려고 시도하는 것이 완료 될 수 있다고 생각합니다. – bytebender

0

상기 대리인을 사용하는 방법에 대한 몇 가지 사용 사례를 설명해 주실 수 있습니까?

PopulateChanges()가 DateTime 배열의 List <>을 반환하면 모든 것을 처리하고 DateTime.MinValue로 설정한다는 것을 의미합니다. 넣으려는 코드 단위는 정확히 무엇입니까 대의원?

+0

내가하고있는 모든 것은 실제 예제를 만드는 것입니다. 필자의 말처럼, 나는 이것과는 다른 영역에서 (단지 나머지 부분 만) for 루프 부분을 실제로 caling합니다. 데이터를 포함하는 다른 목록 이 있는데, 이것은 문자열 배열의 각 요소를 마지막으로 변경된 시간에 매핑합니다. 변경 사항이 지워지면 시간을 MinValue로 재설정해야합니다. 새로운 변경 사항이 발생하면 해당 요소에 새로운 DateTime이 적용됩니다. –

0

항상 모범 사례가 있습니다 그러한하지만 모든 사람이 말한 것을 모두 동의하면 나는 모르겠어 ... 난 당신이 여러 가지 이유로 귀하의 중첩 된 배열을 열거해야 제대로 이해하면

및 여기에 그 기능을 수행하는 여러 가지 방법이 있습니다 .. 재사용 할 수 캡슐화 좋아하지만 할 것은 하나를 사용하여 LINQ 아웃 한 ...

List<DateTime[]> changes = new List<DateTime[]>(); 
changes = PopulateChanges(); 

// *** As pointed out ForEach this will not change the value in the array, Thanks!*** 
changes.ForEach(change => change.ToList().ForEach(date => date = DateTime.MinValue)); 

// this how ever works but is kind of confusing... 
changes = changes.Select(change => change.Select(date => DateTime.MinValue).ToArray()).ToList(); 
//Even that would get old writing it over and over again... 

내가 이런 식으로 그것을 할 것 ...

입니다
private void ForEachOnNestedDates(List<DateTime[]> list, Func<DateTime, DateTime> method) 
{ 
    // Use your code... 
    for (int i = 0; i < list.Count; i++) 
    { 
     for(int j = 0; j < list[i].Length; j++) 
     { 
      list[i][j] = method.Invoke(list[i][j]); 
     } 
    } 
} 

이렇게하면 재사용하고 각 항목마다 다른 작업을 수행 할 수 있습니다. 전의.

//Add a Day to each datetime value 
ForEachOnNestedDates(changes, (DateTime date) => date.AddDays(1)); 

//You also make it even more readable 
ForEachOnNextedDates(changes, DoSomethingWithDate); 

private DateTime DoSomethingWithDate(DateTime value) 
{ 

} 

각 날짜 시간 함께 할 일이 반대로 각 날짜의 시간에 할 일을 위해 사용되는 ... 그건 약간 다른 것입니다.

+2

람다의 매개 변수에 값을 할당해도 쿼리 된 콜렉션이 변경되지 않습니다 ... – dtb

+0

수정되었습니다. 두 번째 옵션은 작동하지만 ... – bytebender

관련 문제