Linq запрос List <List <class>> Где свойство класса C # - PullRequest
0 голосов
/ 02 июля 2018

Может ли кто-нибудь предложить мне способ выбрать один из списков в родительском списке, где один из его элементов имеет определенное значение свойства?

public class HierarchyLevel
{
    public string Abbreviation;
    public string Name;
    public string Value;
    public Type LevelType;
    public List<HierarchyLevel> Children = new List<HierarchyLevel>();
}


public static List<List<HierarchyLevel>> ElementaryTypes = new List<List<HierarchyLevel>>();

Я на самом деле пытаюсь получить список с полем LevelType определенного типа.

Ответы [ 4 ]

0 голосов
/ 05 июля 2018

Вы писали:

Я на самом деле пытаюсь получить список с полем LevelType определенного типа.

Что вы хотите, если у вас есть несколько HierarchyLevels с этим LevelType? А что вы хотите, если LevelType?

вообще нет HierarchyLevels

Предположим, что вам нужны все уровни HierarchyLevel с этим LevelType. Если позже вам понадобится только первый или тот, который имеет определенную аббревиатуру (или что-то еще), вы всегда можете использовать .FirstOrDefault или .Where. и сделайте ToList в конце.

Реализация его как функции расширения. См. Демистифицированные методы расширения

public static IEnumerable<HierarchyLevel> GetHierarchyLevelsWithLevelType(
    this IEnumerable<HierarchyLevel> hierarchyLevels,
    LevelType desiredLevelType)
{
    foreach (var hierarchyLevel in hierarchyLevels)
    {
        if (hierarchyLevel.LevelType == desiredLevelType)
        {    // found one!
             yield return hierarchyLevel;
        }

        // using recursion: check all the Children
        IEnumerable<HierarchyLevel> childrenWithDesiredLevelType = hierarchyLevel.Children
            .GetHierarchyLevelsWithLevelType(desiredLevelType);
        foreach(var childWithDesiredLevelType in childrenWithDesiredLevelType)
        {
            yield return childWithDesiredLevelType;
        }
    }
}

Из-за рекурсии все внуки, их дети и т. Д. Будут возвращены

использование:

var allSpecialHierarchies = myHierarchies.GetHierarchyLevelsWithLevelType(LevelType.Special);

// get the first:
var firstSpecialHierarchy = allSpecialHierarchies.FirstOrDefault();
// get the first three named "Shakespeare:
var threeShakesPeares = allSpecialHierarchies
    .Where(hierarchyLevel => hierarchyLevel.Name == "Shakespeare")
    .Take(3)

Для лучшего использования вы должны предоставить версию с параметром IQualityComparer<LevelType>. Пусть эта функция вызовет эту функцию.

И хорошая задача: чтобы быть полностью совместимым с LINQ, создайте версию с предикатом, который возвращает тип T и средство сравнения равенства для этого типа T, чтобы вы могли иметь все уровни HierarchyLevel с определенным именем или аббревиатурой.

0 голосов
/ 02 июля 2018

Вы можете решить свою проблему с помощью recursion, рассмотрите пример ниже: - Я взял образец типа String, вы можете использовать любой из ваших Type

List<List<HierarchyLevel>> sample = new List<List<HierarchyLevel>>();

Type yourType = typeOf(string);

List<HierarchyLevel> filtered = sample.Where(x => ContainsElement(x, yourType));

public void bool ContainsElement(List<HierarchyLevel> list,Type yourType)
{
  if(list.Any(x => x.LevelType == yourType)      //check if current node has same level type
     return true;
  else if(list.Childern.Count > 0)              //check if current node has children if yes then call ContainsElement again
     return list.Children.Any(x => ContainsElement(x,yourType));
  else
     return false;                              //else return false in last
}
0 голосов
/ 02 июля 2018

Спасибо user743414 за то, что указал, как все просто :) Используя вместо этого словарь, я мог бы ссылаться на конкретный список. (Это также более быстрый вариант.)

Dictionary<Type,List<HierarchyLevel>> HierarchicalData;

Теперь я могу использовать его с ключом «Тип»:

private void UpdateGeneralData(object Entity, Dictionary<Type,List<HierarchyLevel>> TypeData)
{
    CBType.Items.Clear();
    foreach (var item in TypeData[Entity.GetType()])
    {
        CBType.Items.Add(item);
    }
}
0 голосов
/ 02 июля 2018

Как то так (?):

   List<HierarchyLevel> var = hLevel.Select(h => h.Children.Where(c => c.Param = "desired param")).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...