开发者

How to select non-distinct elements along with their indexes

 List<s开发者_StackOverflow中文版tring> str = new List<string>() {
   "Alpha", "Beta", "Alpha", "Alpha", "Gamma", "Beta", "XYZ" };

Expected output:

 String | Indexes
 ----------------------------
 Alpha  | 0, 2, 3
 Beta   | 1, 5

Gamma and XYZ are distinct so, they are ignored.

I've done this by comparing the strings manually. Would it be possible to do it using LINQ in more easier way?


foreach (var grp in
   str.Select((s, i) => new { s, i })
      .ToLookup(pair => pair.s, pair => pair.i)
      .Where(pair => pair.Count() > 1))
{   
    Console.WriteLine("{0}: {1}", grp.Key, string.Join(", ", grp));
}


Something like this should work:

var elements = str
    .Select((Elem, Idx) => new {Elem, Idx})
    .GroupBy(x => x.Elem)
    .Where(x => x.Count() > 1);

If you want to get a Dictionary<string,List<int>> having the duplicated string as key and the indexes as value, just add

.ToDictionary(x => x.Key, x => x.Select(e => e.Idx).ToList() );

after Where()


You can get the non-distinct strings by grouping, then you can get the index for each non-distinct string and group them to create an array for each string:

var distinct = new HashSet<string>(
  str.GroupBy(s => s)
  .Where(g => g.Count() > 1)
  .Select(g => g.Key)
);

var index =
  str.Select((s, i) => new {
    Str = s,
    Index = i
  })
  .Where(s => distinct.Contains(s.Str))
  .GroupBy(i => i.Str).Select(g => new {
    Str = g.Key,
    Index = g.Select(s => s.Index).ToArray()
  });

foreach (var i in index) {
  Console.WriteLine("{0} : {1}", i.Str, String.Join(", ", i.Index.Select(n => n.ToString())));
}

Output:

Alpha : 0, 2, 3
Beta : 1, 5
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜