2012-05-25 2 views
20

에 선택 나는 결과로 나는 그룹화 된 오브젝트와 개수를 모두 포함하는 하나의 새로운 객체를 갖고 싶어하는 LINQ 쿼리를 자신의 유형별로Linq에 새로운 객체

var x = (from t in types select t).GroupBy(g =>g.Type) 

하는 그룹 개체가. 이런 식으로 뭔가 :

type1, 30  
type2, 43  
type3, 72 

더 명확하게하기 : 그룹화 결과는 하나의 객체에 있어야하지 항목 유형

답변

24

읽기 : 마이크로 소프트 MSDN 사이트에서 해당 LINQ - Grouping Operators에서 101 LINQ Samples

var x = from t in types group t by t.Type 
     into grp  
     select new { type = grp.key, count = grp.Count() }; 

forsingle 객체는 모두 StringBuilder를 사용하고 수행 또는 사전

// fordictionary 
    var x = (from t in types group t by t.Type 
    into grp  
    select new { type = grp.key, count = grp.Count() }) 
    .ToDictionary(t => t.type, t => t.count); 

    //for stringbuilder not sure for this 
    var x = from t in types group t by t.Type 
     into grp  
     select new { type = grp.key, count = grp.Count() }; 
    StringBuilder MyStringBuilder = new StringBuilder(); 

    foreach (var res in x) 
    { 
     //: is separator between to object 
     MyStringBuilder.Append(result.Type +" , "+ result.Count + " : "); 
    } 
    Console.WriteLine(MyStringBuilder.ToString()); 
+0

고마워, 이건 내게는 – Jeff

19

유형의 그룹화 객체의 모든, 또는 모든 당 객체?

var query = types.GroupBy(t => t.Type) 
       .Select(g => new { Type = g.Key, Count = g.Count() }); 

foreach (var result in query) 
{ 
    Console.WriteLine("{0}, {1}", result.Type, result.Count); 
} 

편집 : 그것은 그냥 할 수 있습니다 같은 소리 당신이 사전에 원하는 경우, 당신은 사용할 수 있습니다

var query = types.GroupBy(t => t.Type) 
       .ToDictionary(g => g.Key, g => g.Count()); 

가 쌍으로 선택할 필요는 없습니다 다음 사전을 작성하십시오.

+0

불투명 한 질문에 사과드립니다. 귀하의 솔루션은 내가 원하는 것과 매우 유사하지만 유형별 객체가 아닌 단일 객체로 모든 그룹화 결과를 가져오고 싶습니다. – Jeff

+1

@ 제프 : 허용 한 답변은 실제로 내 것과 같습니다 ... 그냥 사전에 있습니다. . 결과는 * 단일 객체 (* 쿼리)에 * 모두 있습니다. 내 솔루션이 당신을 위해하지 않는 것을 달성하고자하는 것이 아직 명확하지 않습니다. 유형별로 그룹화한다면 그룹당 하나의 객체를 가질 수 있습니다. 그러나 여기에서'query'는 모든 그룹에게 * 부여 할 쿼리입니다. –

+0

글쎄, 그룹화 된 목록에서 어떤 유형을 찾고 있는지 알고 있습니다. 따라서 사전에 넣으면 쿼리 외부에서 객체를 생성하기가 쉽습니다. – Jeff

3
var x = from t in types 
     group t by t.Type into grouped 
     select new { type = grouped.Key, 
        count = grouped.Count() }; 
+0

측면 질문 : 충분히 일반적으로 선택하면 새로운 {..} updateChanges 때 DB에 삽입합니까? –

+0

@DanyKhalife select 문을 사용할 때 updateChanges를 호출 할 필요가 없습니다. 사용하면 아무 것도 삽입하지 않고 DB에서 select 문을 실행합니다. – daryal

1

의 형식에서 변환됩니다 그것이를 추가 빈도를 얻기 위해 각 유형별로 조회를 수행하려면 열거 형을 사전으로 변환해야합니다.

var types = new[] {typeof(string), typeof(string), typeof(int)}; 
var x = types 
     .GroupBy(type => type) 
     .ToDictionary(g => g.Key, g => g.Count()); 
foreach (var kvp in x) { 
    Console.WriteLine("Type {0}, Count {1}", kvp.Key, kvp.Value); 
} 
Console.WriteLine("string has a count of {0}", x[typeof(string)]); 
14

대답은 여기 나를 사랑 받고 있지만, 2016 년, 나는 다음과 같은 LINQ 쓸 수 있었다 :

List<ObjectType> objectList = similarTypeList.Select(o => 
    new ObjectType 
    { 
     PropertyOne = o.PropertyOne, 
     PropertyTwo = o.PropertyTwo, 
     PropertyThree = o.PropertyThree 
    }).ToList(); 
+1

이것은 시원하고 교육적입니다. 감사! –

0

이것은 LINQ 쿼리에서 새 개체를 만드는 데 필요한 구문에 대한 좋은 기사입니다 .

그러나 객체의 필드를 채우는 할당이 단순한 할당 (예 : 문자열을 정수로 파싱하는 것) 이상인 경우 그 중 하나가 실패하면 디버깅 할 수 없습니다. 개별 할당 중 하나에 중단 점을 만들 수 없습니다.

모든 할당을 서브 루틴으로 이동하고 거기에서 새 오브젝트를 리턴하고 해당 루틴에서 중단 점을 설정하려고 시도하면 해당 루틴에서 중단 점을 설정할 수 있지만 중단 점은 트리거되지 않습니다.

그래서 대신 :

var query2 = from c in doc.Descendants("SuggestionItem") 
       select new SuggestionItem 
         { Phrase = c.Element("Phrase").Value 
         Blocked = bool.Parse(c.Element("Blocked").Value), 
         SeenCount = int.Parse(c.Element("SeenCount").Value) 
         }; 

또는

var query2 = from c in doc.Descendants("SuggestionItem") 
         select new SuggestionItem(c); 

내가 대신했다 :

List<SuggestionItem> retList = new List<SuggestionItem>(); 

var query = from c in doc.Descendants("SuggestionItem") select c; 

foreach (XElement item in query) 
{ 
    SuggestionItem anItem = new SuggestionItem(item); 
    retList.Add(anItem); 
} 

이 허용 나를 쉽게 디버그 및 실패 된 할당을 파악한다.이 경우 XElement에 SuggestionItem에서 설정할 구문 분석 필드가 누락되었습니다.

새 라이브러리 루틴에 대한 단위 테스트를 작성하는 동안 Visual Studio 2017에서 이러한 문제가 발생했습니다.