我有一个数据表可能在其中一列中包含以下数据
ID Name Other Cols
--------------------------
1 Apple
2 Apple
3 Apple
4 Orange
5 Orange
6 Mango
7 Banana
我想要做的是在每个重复值之后附加一个数字,以便我得到以下输出。
ID Name Other Cols
-------------------------
1 Apple
2 Apple1
3 Apple2
4 Orange
5 Orange1
6 Mango
7 Banana
这样做的有效方法是什么?我的表可以包含近500万条记录,性能也是一个问题。
PS:我必须最终将这些数据转换为对象的列表/字典。
更新1 - 我的LINQ /列表以简化形式
Dim items = (From p In dataSet.Tables("personal").AsEnumerable().Skip(totalFetched).Take(1000).ToList()
Join m In dataSet.Tables("members").AsEnumerable().Skip(totalFetched).Take(1000).ToList() On p("members_Id") Equals m("members_Id")
Join a In dataSet.Tables("agreement").AsEnumerable().Skip(totalFetched).Take(1000).ToList() On p("members_Id") Equals a("members_Id")
Select New ClubInformation() With {
.MemberId = clubNumber & a.Field(Of String)("agreementNumber"),
.FirstName = p.Field(Of String)("firstName"),
.LastName = p.Field(Of String)("lastName")
}).ToList()
我在这里会有重复的内容,并希望在之后添加一些数字
.MemberId = clubNumber & a.Field(Of String)("agreementNumber")
答案 0 :(得分:1)
使用linq这样的东西。不确定这会如何在列表中有几百万的性能明智但你明白了:
var myList = new List<MyClass>() { new MyClass { Id = 1, Name = "Apple" },
new MyClass { Id = 2, Name = "Apple" }, new MyClass { Id = 3, Name = "Orange" } };
var newList = myList.Select((x, y) => new MyClass
{
Id = x.Id,
Name = x.Name + " " +
(myList.GetRange(0, y).Count(z => z.Name == x.Name) == 0 ? string.Empty :
myList.GetRange(0, y).Count(z => z.Name == x.Name).ToString())
});
.Net小提琴
答案 1 :(得分:1)
如果数据已经在List<string>
,那么这可以通过获取每个值并循环来替换像这样的值来完成
int num = 0;
foreach (var fruit in fruits.Where(item => item == "Orange")) //Orange can be a variable instead when looping through unknown items
{
num++
fruit = num > 1 ? fruit + num.ToString() : fruit;
}
如果您在制作之前不知道列表中的值,您也可以这样做
var duplicateFruit = fruits.GroupBy(fruit => fruit).SelectMany(grp => grp.Skip(1).Take(1));
foreach(var val in duplicateFruit)
{
int num = 0;
foreach (var fruit in fruits.Where(item => item == val))
{
num++
fruit = num > 1 ? fruit + num.ToString() : fruit;
}
}
答案 2 :(得分:0)
使用Linq,您可以轻松做到:-
var fruits= new List<Fruit>() { new Fruit { Id = 1, Name = "Apple" },
new Fruit { Id = 2, Name = "Apple" }, new Fruit { Id = 3, Name = "Orange" } };
var duplicates = fruits.GroupBy(x => x.Name)
.Where(g => g.Count() > 1)
.Select(y => y)
.ToList();
foreach (var fruit in duplicates)
{
var index = 0;
fruit.ToList().ForEach(l => l.Name = $"{l.Name}{index++ > 1 ? (index-1).ToString() : string.Empty}");
}
答案 3 :(得分:0)
我知道您已经接受了一个解决方案,但这对我来说非常易读。
fruits
.GroupBy(p => p.Name)
.SelectMany(g =>
{
g.Select((tmp, index) =>
{
tmp.Name = index == 0 ? tmp.Name : $"{tmp.Name}{index}";
return tmp;
}).ToList();
return g;
}).ToList();