附加数字以复制数据表中的值c#

时间:2016-04-01 10:29:44

标签: c# performance linq

我有一个数据表可能在其中一列中包含以下数据

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")

4 个答案:

答案 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小提琴

https://dotnetfiddle.net/kKCda1

答案 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();