참고 :이 대답의 첫 번째 부분은 C# 6입니다. C# 7을 사용하는 경우 끝에 설명 된대로 C# 7의 내장 튜플 반환 유형을 사용할 수 있습니다.
귀하의 코드 :
detailsList.Where(where_part).Select(x=>x.Week).GroupBy(x=>x.Week).Select(x=>x.Count)
... 익명 유형을 선택하지 않습니다. 그러면 IEnumerable<int>
이 반환됩니다. 내가 질문을 이해한다면, 당신은 (예를 구성하는) 등의 세 가지 목록을 반환하려면,
detailsList.Where(where_part).Select(x=>x.Week).GroupBy(x=>x.Week)
.Select(x=>new {Week = x.Key, x.Count()})
을 어쨌든 : 당신이 주/카운트 쌍의 목록을 원한다면, 당신은해야 할 것
일주일에 구운 케이크의
- 수
- 주 당 판매되는 케이크의 수
- 주
당 연소 케이크의 수 ... 어디 갔지 목록의 각 요소는 {Week: 3, Count: 22}
과 비슷합니다.
Tuple
을 사용하여 주/횟수 쌍을 저장할 수 있습니다. 유형System.DateTime.Week
이 없으므로 단지 int
이므로 Tuple
은 Tuple<int, int>
이됩니다. 그리고 그 중 일부는 List
(또는 IList
, ICollection
또는 심지어 IEnumerable
초)입니다.
[그것은 당신이 주어진 "주"의 "수"를 찾기 위해이 목록을 사용하려고 할 수 있음을 나 파업 - List
Tuple<int, int>
의보다는 Dictionary<int, int>
을 생성하는 경우, 그것은 더 편리 할 수도를 에스. 이 경우 마지막 Select
을 ToDictionary()
전화로 바꿀 수 있습니다.]
어쨌든 이제 세 개의 목록 (또는 사전)을 메서드에서 반환하는 방법에 대한 문제가 있습니다. 몇 가지 옵션이 있습니다 :
- 하지 마십시오. 세 가지 메소드 만들기 :
- 목록을 집계하는 객체 (배열, 다른 목록, 다른 튜플 또는 자신의 유형조차도)를 반환합니다.
- "out"매개 변수를 3 개 사용하십시오.
Tuple
유형을 사용하면 상대적으로 쉽게 반환 값/출력 매개 변수의 유형을 선언 할 수 있습니다. 개인적으로, 나는 아마 내 자신의 반환 유형을 만들 것 같은 :
난 그냥
IReadOnlyCollection<Tuple<int, int>>
을 사용하는 것 중 하나이 경우 ...
List
:-)를 사용하지 않을 거라고 제외
class CakeInfo
{
List<Tuple<int, int>> CakesBakedByWeek { get; private set; }
List<Tuple<int, int>> CakesSoldByWeek { get; private set; }
List<Tuple<int, int>> CakesBurntByWeek { get; private set; }
public CakeInfo(
IEnumerable<Tuple<int, int>> baked,
IEnumerable<Tuple<int, int>> sold,
IEnumerable<Tuple<int, int>> burnt
)
{
CakesBakedByWeek = baked.ToList();
CakesSolByWeek = sold.ToList();
CakesBurntByWeek = burnt.ToList();
}
}
... 또는 IReadOnlyDictionary<int, int>
.
이를 사용하려면
GetCakeInfo
방법과 같이 보일 수 있습니다 :
public CakeInfo GetCakeInfo()
{
var detailsList = ...;
var baked = detailsList.Where(where_part_baked).Select(x=>x.Week).GroupBy(x=>x.Week)
.Select(x=>new Tuple<int, int>(x.Key, x.Count()));
var sold = detailsList.Where(where_part_sold).Select(x=>x.Week).GroupBy(x=>x.Week)
.Select(x=>new Tuple<int, int>(x.Key, x.Count()));
var burnt = detailsList.Where(where_part_burnt).Select(x=>x.Week).GroupBy(x=>x.Week)
.Select(x=>new Tuple<int, int>(x.Key, x.Count()));
return new CakeInfo(baked, sold, burnt);
}
을 (물론, 당신은 위의 반복 코드를 고려하는 도우미 메서드를 가질 수있다). 당신은 C# 7을 사용한 경우
C# 7
, 당신은 더 쉽게와 같은 튜플 반환 형식을 사용하여 메소드로부터의 반환 값으로서 세 가지 목록을 반환 할 수 :
를
public (
List<Tuple<int, int>> baked,
List<Tuple<int, int>> sold,
List<Tuple<int, int>> burnt
) GetCakeInfo()
{
...
return (baked, sold, burnt);
}
당신과 같이이 전화 것 :
(List<Tuple<int, int>> baked, List<Tuple<int, int>> sold, List<Tuple<int, int>> burnt) = GetCakeInfo();
... 나 ...
var cakeLists = GetCakeInfo();
var baked = cakeLists.baked;
// ...
더 중요한 것은, 당신은 목록 요소에 대한 이전 Tuple
유형이 아니라 새로운 ValueTuple
유형을 사용할 수 있습니다. 따라서 :
public (
List<(int week, int count)> baked,
List<(int week, int count)> sold,
List<(int week, int count)> burnt
) GetCakeInfo()
{
...
return (baked, sold, burnt);
}
가장 좋은 대답은 익명 유형을 사용하는 것입니다. C# 7 - 적어도 애플리케이션 내에서 - 튜플 유형을 사용합니다. 그게 당신을위한 선택입니까? –
오브젝트 유형 –
을 사용할 수 있습니다. 어떻게이 목록을 작성합니까? 목록이 반환되면 어떻게 사용 하시겠습니까? – Enigmativity