У меня есть a List<string>
это содержит дубликаты, и я должен найти индексы каждого.
Каков самый изящный, эффективный путь кроме цикличного выполнения через все объекты. Я нахожусь на.NET 4.0, таким образом, LINQ является опцией. Я сделал тонны поиска, и подключение находят что-либо.
Демонстрационные данные:
var data = new List<string>{"fname", "lname", "home", "home", "company"}();
Я должен получить индексы "дома".
Вы можете создать объект из каждого элемента, содержащего его index, затем сгруппируйте по значению и отфильтруйте группы, содержащие более одного объекта. Теперь у вас есть группирующий список с объектами, содержащими текст и их исходный индекс:
var duplicates = data
.Select((t,i) => new { Index = i, Text = t })
.GroupBy(g => g.Text)
.Where(g => g.Count() > 1);
Как насчет чего-то вроде этого
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));
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++;
}
}
}