linq 将索引号追加到列表中的重复字符串值-通过使用Lambda

siotufzp  于 2022-12-06  发布在  其他
关注(0)|答案(3)|浏览(121)

我有一个IList<string>(),它保存了一些字符串值,列表中可能有重复的项。我想要的是在字符串的末尾附加一个索引号来消除重复。
例如,我的列表中有以下值:字符串A,字符串B,字符串C,字符串A,字符串A,字符串B。我希望结果看起来像:字符串A1、字符串B1、字符串C、字符串A2、字符串A3、字符串B2。我需要保留列表中的原始顺序。
有没有办法只使用一个Lambda表达式?

vnzz0bqm

vnzz0bqm1#

您正在查找类似以下内容的内容:

yourList.GroupBy(x => x)
        .SelectMany(g => g.Select((x,idx) => g.Count() == 1 ? x : x + idx))
        .ToList();

**编辑:**如果元素顺序很重要,下面是另一个解决方案:

var counts = yourList.GroupBy(x => x).ToDictionary(x => x.Key, x => x.Count());

var values = counts.ToDictionary(x => x.Key, x => 0);

var list = yourList.Select(x => counts[x] > 1 ? x + ++values[x] : x).ToList();
7gs2gvoe

7gs2gvoe2#

您可以:

List<string> list = new List<string> { "StringA", "StringB", "StringC", "StringA", "StringA", "StringB" };
var newList =
    list.Select((r, i) => new { Value = r, Index = i })
    .GroupBy(r => r.Value)
    .Select(grp => grp.Count() > 1 ?
                grp.Select((subItem, i) => new
                {
                    Value = subItem.Value + (i + 1),
                    OriginalIndex = subItem.Index
                })
                : grp.Select(subItem => new
                {
                    Value = subItem.Value,
                    OriginalIndex = subItem.Index
                }))
    .SelectMany(r => r)
    .OrderBy(r => r.OriginalIndex)
    .Select(r => r.Value)
    .ToList();

您将获得:

StringA1,StringB1,StringC,StringA2,StringA3,StringB2

如果你不想保持秩序,那么你可以做:

var newList = list.GroupBy(r => r)
                .Select(grp => grp.Count() > 1 ? 
                           grp.Select((subItem, i) => subItem + (i + 1))
                           : grp.Select(subItem => subItem))
                .SelectMany(r => r)
                .ToList();
5t7ly7z5

5t7ly7z53#

这使用了一些lambda表达式和linq来完成,保持了顺序,但是我建议使用一个带有foreach循环和yield return的函数会更好。

var result = list.Aggregate(
        new List<KeyValuePair<string, int>>(),
        (cache, s) =>
        {
            var last = cache.Reverse().FirstOrDefault(p => p.Key == s);
            if (last == null)
            {
                cache.Add(new KeyValuePair<string, int>(s, 0));
            }
            else
            {
                if (last.Value = 0)
                {
                    last.Value = 1;
                }

                cache.Add(new KeyValuePair<string, int>(s, last.Value + 1));
            }

            return cache;
        },
        cache => cache.Select(p => p.Value == 0 ? 
            p.Key :
            p.Key + p.Value.ToString()));

相关问题