2017-11-06 1 views
-1

나는 3 종류의 목록을 가지고 있습니다 System.Collections.Generic.List<<anonymous type: System.DateTime.Week, int Count>>.C#에서 여러 개의 익명 형식 목록을 반환하는 최선의 방법은 무엇입니까?

제 프로그램에서 DB에서 가져온 데이터가 들어있는 유형리스트 (detailsList라고합시다)를 사용하고 있습니다. 다음과 같이 내가 System.Collections.Generic.List<<anonymous type: System.DateTime.Week, int Count>>.

는 기본적으로이 목록의 선택 부분은 타입 인 3 개 별도의 목록을 만드는거야이 detailsList 사용

:

detailsList 
    .Where(where_part) 
    .Select(x => x.Week) 
    .GroupBy(x => x.Week) 
    .(x => new { Week = x.Key, Count = x.Count() }) 
    .ToList(); 

어떻게하는 방법에서이 목록을 반환 할 수 있습니다 가장 최적의 방법을 사용하여? 이 경우이 메서드의 반환 형식은 무엇입니까?

참고 : 반환 된 후이 목록을 유지하는 3 개의 다른 데이터 표를 채워야하므로이 목록에 개별적으로 다시 액세스하고 싶습니다.

+2

가장 좋은 대답은 익명 유형을 사용하는 것입니다. C# 7 - 적어도 애플리케이션 내에서 - 튜플 유형을 사용합니다. 그게 당신을위한 선택입니까? –

+0

오브젝트 유형 –

+0

을 사용할 수 있습니다. 어떻게이 목록을 작성합니까? 목록이 반환되면 어떻게 사용 하시겠습니까? – Enigmativity

답변

0

출력과 일치하는보기 모델을 생성하고이를 사용하여 System.Collections.Generic.List<YourViewModel>을 만들 수 있습니다. 그럼 그걸 돌려 줄 수있어.

1

참고 :이 대답의 첫 번째 부분은 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()}) 

을 어쨌든 : 당신이 주/카운트 쌍의 목록을 원한다면, 당신은해야 할 것

일주일에 구운 케이크의
  1. 주 당 판매되는 케이크의 수

당 연소 케이크의 수 ... 어디 갔지 목록의 각 요소는 {Week: 3, Count: 22}과 비슷합니다.

Tuple을 사용하여 주/횟수 쌍을 저장할 수 있습니다. 유형System.DateTime.Week이 없으므로 단지 int이므로 TupleTuple<int, int>이됩니다. 그리고 그 중 일부는 List (또는 IList, ICollection 또는 심지어 IEnumerable 초)입니다.

[그것은 당신이 주어진 "주"의 "수"를 찾기 위해이 목록을 사용하려고 할 수 있음을 나 파업 - ListTuple<int, int>의보다는 Dictionary<int, int>을 생성하는 경우, 그것은 더 편리 할 수도를 에스. 이 경우 마지막 SelectToDictionary() 전화로 바꿀 수 있습니다.]

어쨌든 이제 세 개의 목록 (또는 사전)을 메서드에서 반환하는 방법에 대한 문제가 있습니다. 몇 가지 옵션이 있습니다 :

  1. 하지 마십시오. 세 가지 메소드 만들기 :
  2. 목록을 집계하는 객체 (배열, 다른 목록, 다른 튜플 또는 자신의 유형조차도)를 반환합니다.
  3. "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); 
} 
관련 문제