Что самый изящный путь состоит в том, чтобы найти индексом дублирующихся объектов в Списке C#

У меня есть a List<string> это содержит дубликаты, и я должен найти индексы каждого.

Каков самый изящный, эффективный путь кроме цикличного выполнения через все объекты. Я нахожусь на.NET 4.0, таким образом, LINQ является опцией. Я сделал тонны поиска, и подключение находят что-либо.

Демонстрационные данные:

var data = new List<string>{"fname", "lname", "home", "home", "company"}();

Я должен получить индексы "дома".

9
задан Jeff Atwood 27 April 2010 в 05:10
поделиться

3 ответа

Вы можете создать объект из каждого элемента, содержащего его index, затем сгруппируйте по значению и отфильтруйте группы, содержащие более одного объекта. Теперь у вас есть группирующий список с объектами, содержащими текст и их исходный индекс:

var duplicates = data
  .Select((t,i) => new { Index = i, Text = t })
  .GroupBy(g => g.Text)
  .Where(g => g.Count() > 1);
21
ответ дан 4 December 2019 в 08:51
поделиться

Как насчет чего-то вроде этого

var data = new List<string>{"fname", "lname", "home", "home", "company"};

            var duplicates = data
                            .Select((x, index) => new { Text = x, index})
                            .Where( x => (  data
                                            .GroupBy(i => i)
                                            .Where(g => g.Count() > 1)
                                            .Select(g => g.Key).ToList()
                                          ).Contains(x.Text));
0
ответ дан 4 December 2019 в 08:51
поделиться
using System;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        var data = new List<string> { "fname", "lname", "home", "home", "company" };
        foreach (var duplicate in FindDuplicates(data))
        {
            Console.WriteLine("Duplicate: {0} at index {1}", duplicate.Item1, duplicate.Item2);
        }
    }

    public static IEnumerable<Tuple<T, int>> FindDuplicates<T>(IEnumerable<T> data)
    {
        var hashSet = new HashSet<T>();
        int index = 0;
        foreach (var item in data)
        {
            if (hashSet.Contains(item))
            {
                yield return Tuple.Create(item, index);
            }
            else
            {
                hashSet.Add(item);
            }
            index++;
        }
    }
}
3
ответ дан 4 December 2019 в 08:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: