2011-09-27 39 views
4

我有這樣的類:的GroupBy在LINQ和設置屬性

public class Foo 
{ 
    public string Regn{get;set;} 

    public string DocName{get;set;} 

    ... 
} 

在我的應用程序這一類的IEnumerable用途:

IEnumerable<Foo> items; 

如何獲得新的IEnumerable,其中對於利用的所有物品相同REGN和屬性可採用DocName可採用DocName套這樣的(只有當與同一對象可採用DocName> 1):

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

[UPDATE] 輸入樣本:

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

輸出:

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

可以與LINQ組和投出僅具有一個項目組,那麼迭代項各組設置在在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)'你可以使用帶索引器的'Select',當性能問題很重要時,你當前的方法並不好,同時它也依賴於類的平等實現,可能會導致不同對象的值相同。我認爲在這種情況下,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 }; 
       }); 
     });