Radzhab
@Radzhab

Как сделать Distinct для List?

Есть json, который я десериализовал в класс. Загружаю в cписок List. Хочу выбрать уникальные данные по параметру id. Использовал MoreLinq, yо он видит только data

public class Rootobject
{
    public Datum[] data { get; set; }
}

public class Datum
{
    public string id { get; set; }
    public string public_role_id { get; set; }
    public int oref { get; set; }
    public string[] conference_topic_ids { get; set; }
    public string conference_industry_id { get; set; }
    public DateTime? deleted_at { get; set; }
    public bool hidden { get; set; }
    public Person person { get; set; }
}
  • Вопрос задан
  • 736 просмотров
Решения вопроса 1
mindtester
@mindtester Куратор тега C#
http://iczin.su/hexagram_48
уточните вопрос - выхотите получить выборку по конкретному id?
если да, то надо не Distinct() использовать, а Where(d => (d.id == targetId))

если вы примените Distinct(), то даже при наличии повторяющихся id, но с различными данными, то вы получите ровно всю исходную коллекцию

ну и как возможный вариант для повторяющихся id, если вы хотите получить только список id, то
код и выхлоп под спойлером
using System;
using System.Collections.Generic;
using System.Linq;

public class dt
{
    public int id;
    public int val;
}

namespace distinct_or_not_distinct
{
    public static class Program
    {
        public static void Main()
        {
            var listdata = new List<dt>();
            listdata.Add(new dt() { id = 1, val = 11 });
            listdata.Add(new dt() { id = 1, val = 12 });
            listdata.Add(new dt() { id = 2, val = 21 });
            listdata.Add(new dt() { id = 2, val = 22 });
            listdata.Add(new dt() { id = 3, val = 31 });
            
            "distinct dt".print();
            listdata.Distinct().ToList().print();
            newLine();

            "distinct id".print();
            (from d in listdata select d.id).Distinct().ToList().print();
            newLine();

            var targetId = 2;
            $"target id {targetId}".print();
            listdata.Where(d => (d.id == targetId)).ToList().print();
            newLine();
        }

        public static void print(this List<dt> l) { foreach (var d in l) d.print(); }
        public static void print(this dt d) => Console.WriteLine($"\tid:{d.id} val:{d.val}");

        public static void print(this List<int> l) { foreach (var i in l) i.print(); }
        public static void print(this int i) => Console.WriteLine('\t' + i.ToString());
        public static void print(this string s) => Console.WriteLine(s);
        public static void newLine() => Console.WriteLine();
    }
}
0wU4V8f.png
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
freeExec
@freeExec
Участник OpenStreetMap
var distinctList = list.data.Distinct(d => d.id);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы