How to append unique numbers to a list of strings

后端 未结 2 1298
北恋
北恋 2021-01-25 08:02

I have this function, which works and gives the correct result:

  
  Pu         


        
相关标签:
2条回答
  • 2021-01-25 08:26

    Here's the VB version:

      <System.Runtime.CompilerServices.Extension()>
      Public Function Unique(List As List(Of String)) As List(Of String)
        ' 1. Remember the initial order
        ' 2. Group by the text
        ' 3. Label the entries in each group
        ' 4. Now reorder them by their original order
        ' 5. Remove the order value to get back to just the name
        Return List.
          Select(Function(Item, Index) New With {Item, Index}).
          GroupBy(Function(IndexedItem) IndexedItem.Item).
          SelectMany(Function(Group) Group.Select(Function(GroupItem, GroupIndex) New With {.Index = GroupItem.Index, .UniqueItem = GroupItem.Item & If(GroupIndex = 0, String.Empty, (GroupIndex + 1).ToString)})).
          OrderBy(Function(IndexedUniqueItem) IndexedUniqueItem.Index).
          Select(Function(IndexedUniqueItem) IndexedUniqueItem.UniqueItem).
          ToList()
      End Function
    
    0 讨论(0)
  • 2021-01-25 08:41

    You could do it using GroupBy and if you want to preserve the original order you can create an anonymous type to include it, then group, then re-sort by the original order.

        string[] input = new[]{ "Apple", "Orange", "Apple", "Pear", "Banana", 
                                "Apple", "Apple", "Orange" };
    
        var result = input
            // Remember the initial order
            .Select((name, i) => new {name, i})
            .GroupBy(x => x.name)
            // Now label the entries in each group
            .SelectMany(g => g.Select((item, j) => 
                new {i = item.i, name = (j == 0 ? item.name : item.name + (j+1))}))
            // Now reorder them by their original order
            .OrderBy(x => x.i)
            // Remove the order value to get back to just the name
            .Select(x => x.name)
            .ToList();
    
    
        foreach (var r in result)
            Console.WriteLine(r);
    

    Result

    Apple
    Orange
    Apple2
    Pear
    Banana
    Apple3
    Apple4
    Orange2
    
    0 讨论(0)
提交回复
热议问题