어떻게하면 더 쉽게 읽을 수 있습니까?어떻게 LINQ를 사용하여 2 foreach를 단순화합니까?
답변
단순화 하시겠습니까? 왜? 간단하고 읽기 쉽고 이해하기 쉽습니다. 너는 더 열심히 인 읽는 그러나 확실하게 더 차갑게 보는 모든 온갖 난투침을 생각해 낼 수있다. 하지 마라! 공상에 빠지라고 충동을 거부하십시오. With_TargetNett가 확장에게 있습니다
이것은. 또한 시간을 낭비하지 말고 시간을 "최적화"하는 시간을 낭비하지 마십시오. 아마도 LINQ 문을 만들기 위해 더 많은 시간을 보냈을 것입니다. 무슨 이득? – Fourth
이것이 내가 권하는 것입니다. 여기에서하는 일을 이해하는 것이 더 쉽습니다. 아래에서 내 대답이 반드시 그럴 필요는 없습니다 (최소한 첫 번째 버전의 경우). 때로는 더 많은 코드가 가독성과 향후 유지 관리를 위해 더 나은 경우도 있습니다. – SPFiredrake
return
from actual in actualProjections
from projection in projections
select Create(book, actual, projection)
.With_TargetNett(projection.DailyProjectedNet.ToString());
은 당신이 할 수있는
static Position With_TargetNett(this Position position, string targetNett)
{
position.TargetNett = targetNett;
return position;
}
그가 원했던 것이지만, 그가 원래 썼던 것이 5 줄을 차지하고, 이것이 5 + 3을 차지하는 것을 확인하십시오. 어쨌든, 그것을 생각하는 시간을 가지기 위해서 +1. –
하나의 옵션은 자신의 크로스 조인을 구현하고, 그 이상 열거하는 것입니다. 그러나, 그것은 아주 예쁜 아직 아니다 :
actualPositions.SelectMany(actual => projections.Select(project => new { actual, project }))
그러나, 당신은 .NET 4.0 이상을 사용하는 경우, 당신은 십자가 튜플 (기본값) 또는 사용자 정의 선택기를 사용하여 확장 메서드에 가입 구현할 수 있습니다
다음public static IEnumerable<Tuple<T1, T2>> CrossJoin<T1, T2>(this IEnumerable<T1> source, IEnumerable<T2> toJoin)
{
return source.CrossJoin(toJoin, Tuple.Create<T1, T2>);
}
public static IEnumerable<T3> CrossJoin<T1, T2, T3>(this IEnumerable<T1> source, IEnumerable<T2> toJoin, Func<T1, T2, T3> selector)
{
return source.SelectMany(tFirst => toJoin.Select(tSecond => selector(tFirst, tSecond)));
}
그리고 이것은 훨씬 더 쉽게 사용할 수 있습니다
foreach(var pair in actualPositions.CrossJoin(projections))
{
var position = Create(book, pair.Item1, pair.Item2);
position.TargetNett = pair.Item2.DailyProjectedNet.ToString();
yield return position;
}
// OR
return actionPositions.CrossJoin(projections, (actual, project) => { /*Code in foreach loop above here, without the "yield". */ });
단지
return
(
from actual in actualProjections
from projection in projections
select new {actual, projection}
).Select(pair =>
{
var position = Create(book, pair.actual, pair.projection);
position.TargetNett = pair.projection.DailyProjectedNet.ToString();
return position;
}
);
재미
에 대한
이 경우 Linq는 가독성이 떨어집니다. 당신은 별도의 방법으로 두 번째 foreach 문을 이동 한 후 사용할 수 있습니다 Linq에는
return from actual in actualPositions
select GetBookPositionList(actual);
새로운 방법 :
private List<BookPosition> GetBookPositionList(ActualPosition actual)
{
foreach (var projection in projections)
{
var position = Create(book, actual, projection);
position.TargetNett = projection.DailyProjectedNet.ToString();
yield return position;
}
}
- 1. 이 쿼리는 어떻게 단순화합니까?
- 2. 이 코드를 어떻게 단순화합니까?
- 3. 변수를 사용하여 vim 단축키를 어떻게 단순화합니까?
- 4. LINQ를 사용하여 어떻게 캐스팅합니까?
- 5. foreach를 사용하여 그리드 생성
- 6. Linq를 사용하여 2 개의 목록 비교
- 7. LINQ를 사용하여 2 개의 Xml 파일 병합
- 8. LINQ를 사용하여 메서드 개선
- 9. linq을 사용하여 foreach를 꺼내십시오
- 10. 이 jQuery 코드는 어떻게 megamenu를 단순화합니까?
- 11. SQL -이 쉬운 쿼리를 어떻게 단순화합니까?
- 12. linq foreach를 사용하는 2 개의 필드 업데이트
- 13. 어떻게이 자바 스크립트를 단순화합니까?
- 14. foreach를 LINQ 표현으로 바꾸십시오.
- 15. MySQL이 쿼리를 단순화합니까?
- 16. LINQ를 사용하여 제품을 계산하십시오
- 17. LINQ를 사용하여 2 개의 목록을 사용하여 사전을 만듭니다.
- 18. foreach를 사용하여 PHP 배열을 반복합니다.
- 19. 2 LINQ를 하나로 결합하는 방법
- 20. LINQ를 사용하여 app.config 업데이트
- 21. Linq를 사용하여 UIElement를 어떻게 찾을 수 있습니까?
- 22. Linq를 사용하여 ViewData.ModelState에서 예외를 어떻게 만듭니 까?
- 23. 엔티티에 LINQ를 사용하여 WPF
- 24. foreach를 사용하여 반복 행 인덱스를 어떻게 알 수 있습니까?
- 25. LINQ를 사용하여 컬렉션 매핑
- 26. LINQ를 사용하여 시간 단위로 그룹화
- 27. LINQ를 사용하여 DataTable 필터링
- 28. Linq를 선택하고, 인덱서를 사용하여
- 29. Foreach를 사용하여 배열로 MySQL 테이블을 업데이트하십시오.
- 30. foreach를 사용하여 배열 배열을 에코하려면 어떻게해야합니까?
는 "더 나은"정의합니다. 가독성? 공연? 다른 것? – Oded
'actionPositions'와'projections'은 어떤 식 으로든 관련이 있습니까? –
나에게 잘 어울립니다. – asawyer