我有这样的课程:
public class Foo
{
public string Regn{get;set;}
public string DocName{get;set;}
...
}
在我的应用程序中,此类使用IEnumerable:
IEnumerable<Foo> items;
如何获得新的IEnumerable,对于具有相同Regn和DocName属性的所有项目,DocName设置如下(仅当具有相同DocName&gt; 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
答案 0 :(得分:2)
如果你有Foo的默认构造函数,请尝试使用它:
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 :(得分: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);
}
}
答案 2 :(得分: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 };
});
});
答案 3 :(得分:-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)
};