2011-09-27 37 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 }; 
       }); 
     });