Способ LINQy проверить, имеют ли какие-либо объекты в наборе то же значение свойства

Начиная с ASP.NET Core 2.2 [ApiController] можно использовать в сборке

[assembly: ApiController]
namespace WebApi
{
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc()
                .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

        }
    }
}

Обратите внимание, что для работы этой версии необходимо установить версию совместимости 2.2 или более позднюю.


Другой подход - просто использовать базовый контроллер и аннотировать его атрибутом [ApiController]

[ApiController]
public abstract class MyBaseController
{
}

Аннотация с атрибутом ApiController .

6
задан George Mauer 23 November 2008 в 02:20
поделиться

5 ответов

Подобный подходу Минимума Y,

Отредактированный:

 var duplicates = agents.GroupBy(a => a.ID).Where(a=>a.Count() > 1);

 foreach (var agent in duplicates)
 {
         Console.WriteLine(agent.Key.ToString());
 }
11
ответ дан 8 December 2019 в 13:03
поделиться

Если это имеет значение я просто сравнил эти два метода, на которые мы ударили в этом потоке. Сначала я определил класс помощника:

public class Foo
{
    public int ID;
}

... и затем вошел в большой список экземпляров со случайным идентификатором:

var list = new List<Foo>();

var r = new Random();

for (int i = 0; i < 10000; i++) list.Add(new Foo { ID = r.Next() });

... и наконец, синхронизировал код:

var sw = new Stopwatch();
sw.Start();
bool b = list.Any(i => list.Where(j => i != j).Any(j => j.ID == i.ID));
Console.WriteLine(b);
Console.WriteLine(sw.ElapsedTicks);

sw.Reset();
sw.Start();
b = (list.GroupBy(i => i.ID).Count() != list.Count);
Console.WriteLine(b);
Console.WriteLine(sw.ElapsedTicks);

Вот вывод того:

Ложь

59392129

Ложь

168151

Таким образом, я думаю смело можно сказать, что группировка и затем сравнение количества групп к количеству объектов являются путем, путь быстрее, чем выполнение "в лоб" "вложило Какое-либо" сравнение.

3
ответ дан 8 December 2019 в 13:03
поделиться

Мое взятие (никакой подсчет!):

var duplicates = agents
  .GroupBy(a => a.ID)
  .Where(g => g.Skip(1).Any());
2
ответ дан 8 December 2019 в 13:03
поделиться
foreach(var agent in Agents) {
    if(Agents.Count(a => a.ID == agent.ID) > 1)
        Console.WriteLine("Found: {0}", agent.ID);
}
1
ответ дан 8 December 2019 в 13:03
поделиться
bool b = list.Any(i => list.Any(j => j.ID == i.ID && j != i));

Это - определенный метод решения "в лоб", но он работает. Мог бы быть более умный способ сделать это с помощью Кроме () дополнительный метод.

Править: Вы на самом деле не сказали, что необходимо было знать, какие объекты "дублированы", только что необходимо было знать ли любой где. Это сделает, то же самое кроме дает Вам список, которого можно выполнить итерации:

список. Где (я => список. Любой (j => j. Идентификатор == я. Идентификатор && j! = i))

Мне нравится группирующийся подход также (группа идентификатором, и найдите группы с количеством> 1).

1
ответ дан 8 December 2019 в 13:03
поделиться
Другие вопросы по тегам:

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