2016-04-01 21 views
0

我有一個DataTable可能包含在列附加了一些重複的數據表中的值C#

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 - MY 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

如果你可以讓他們到一個列表然後LINQ是你最好的選擇 –

+0

目前是您的數據表中存儲或SQL? – QiMata

+0

數據在內存中,通過第三方API以json格式提取。 – user869375

回答

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; 
    } 
} 
+0

謝謝阿爾菲。這工作。現在我只需要注意性能下降......但這真的有幫助! – user869375

+0

它跑得夠快嗎?如果是這樣,我很高興我幫助! –

+1

客戶說他不關心性能:)所以我想它的工作 – user869375

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()) 
}); 

淨小提琴

https://dotnetfiddle.net/kKCda1

+0

雖然你的dotnetfiddle示例拋出執行時間限制已達到錯誤,但我明白了。如果沒有其他方法可行,我也有類似的想法,但仍擔心在循環播放項目時性能可能會受到影響。我將運行一些測試並查看它的外觀。 – user869375

+0

.net小提琴適合我。你剛剛跑了嗎?它自動運行,結果在底部窗口中。 –

+0

聰明的解決方案。我做了一些輕量級的性能測試。正如您所預料的那樣,隨着列表中項目數量的增加,性能呈指數級下降。 5000件物品在1/2秒鐘之內舒適,20000件時鐘在6秒左右。 –

相關問題