2011-09-27 3 views
4

나는 같은 클래스가 GROUPBY 및 설정 특성

IEnumerable<Foo> items; 

방법, 새가 IEnumerable을 얻을 수를 어디에서 모든 항목에 대한 이런 동일한 REGN 및 DOCNAME 속성 DOCNAME 세트 (경우에만 동일한 DOCNAME와 사물> 1)

item.DocName=item.DocName+".1";//+"2",etc. 

[업데이트] 입력 샘플 :

Regn DocName 
1 1 
1 2 
1 2 
2 5 
2 5 
2 6 

출력 : 당신은 LINQ와 그룹과는 단 하나 개의 항목이 그룹을 쫓아 수

Regn DocName 
1 1 
1 2.1 
1 2.2 
2 5.1 
2 5.2 
2 6 
+2

죄송하지만 약간의 질문을 명확하게 해주시겠습니까? 나는 당신이 무엇을 성취하고자하는지 확신하지 못합니다. 어쩌면 의사 코드를 추가 할 수 있습니까? – Marc

+0

@Dublicator는 메서드에 대한 샘플 입력 및 출력을 제공합니다. –

+0

@MAKKAM, 업데이트 된 – dublicator

답변

2

당신이 푸의 기본 생성자이 사용하려고하는 경우 :

var newItems = items. 
      GroupBy(f => Tuple.Create(f.Regn, f.DocName)). 
      SelectMany(gr => gr.Count()<=1 ? gr : gr.Select((f, i) => new Foo 
      { 
       Regn = f.Regn, 
       DocName = f.DocName + "." + (i + 1) 
      })); 
1

, 다음 설정하는 각 그룹의 항목을 반복 DocName :

// Group and filter 
var groups = items.GroupBy(i => new { i.Regn, i.DocName }) 
        .Where(g => g.Count() > 1); 

// Iterate over each group with many items 
foreach (var g in groups) { 
    var itemsInGroup = g.ToArray(); 
    // Iterate over the items and set DocName 
    for (var i = 0; i < itemsInGroup.Length; ++i) { 
     itemsInGroup[i].DocName = g.Key + "." + (i + 1); 
    } 
} 
-1

또는 같은 설정 새로운 결과를 생성하기 위해 LINQ 문을 사용

var fixedSet = from entry in existing 
       group entry by entry.DocName + entry.Regn into groupedEntries 
       let groupedEntriesAsArray = groupedEntries.ToArray() 
       from groupedEntry in groupedEntriesAsArray 
       let index = Array.IndexOf(groupedEntriesAsArray, groupedEntry) 
       select new Foo 
       { 
        DocName = 
         string.Format("{0}.{1}", groupedEntry.DocName, index + 1), 
        Regn = 
         string.Format("{0}.{1}", groupedEntry.Regn, index + 1) 
       }; 
+0

downvote에 대한 건설적인 논증은 환영받을 것입니다 .... – Polity

+0

나는 downvoter가 아니라 코드에있는 몇 가지 문제가 있습니다. 1. 읽을 수 없습니다. 2. 'Array.IndexOf (groupedEntriesAsArray, groupedEntry)'대신에 읽을 수 없습니다. indexer로'Select'를 사용하면 성능 문제가 중요 할 때 현재 접근법이 좋지 않습니다. 또한 클래스의 평등 구현에 달려 있고 다른 objet에 대해 같은 값이 될 수 있습니다. 나는 MAKKAM 대답이이 경우에 최고라고 생각합니다. –

+0

@Saeed Amiri : 감사합니다. 이 방법을 사용하는 부정적인 특성을 알고 있지만 읽기 쉬운 것에 동의해야합니다. linq 문과 같은 쿼리 구문을 도입 한 다른 대답이 없기 때문에이 예제를 제공했습니다. 내가 그것을 읽는 방법, 그것은 완벽한 감각을 만들고 가장 (다른 사람에 비해) 읽을 수 있습니다. 하지만 당연히 이것은 개인적인 취향이다 – Polity

0

모든 하나 개의 문장에서, 그냥 재미.

var query = items.GroupBy(i => new { i.DocName, i.Regn }) 
    .SelectMany(group => 
     { 
      int itemNum = 0; 
      return group.Select(item => 
       { 
        var suffix = itemNum > 0 ? ("." + itemNum) : ""; 
        var newDocName = item.DocName + suffix; 
        itemNum++; 
        return new { item, NewDocName = newDocName }; 
       }); 
     });