Linq查询List <list <class >> where class C#的属性

时间:2018-07-02 13:10:15

标签: c# list linq

有人可以建议我从其中一个元素具有特定属性值的父列表中选择一个列表吗?

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 :(得分:1)

您写道:

  

我实际上是在尝试获取具有特定类型的LevelType字段的列表。

如果这个HierarchyLevels有几个LevelType,您想要什么?而如果这个HierarchyLevels根本没有LevelType,您想要什么?

让我们假设您想要具有此LevelType的所有HierarchyLevel。如果以后您只想要第一个,或者只想要一个缩写(或其他缩写),则可以始终使用.FirstOrDefault.Where。并最后进行ToList

将其实现为扩展功能。参见Extension Methods Demystified

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的相等比较器,以便您可以使所有具有特定名称或缩写的HierarchyLevels。 / p>

答案 1 :(得分:0)

您可以在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
}

答案 2 :(得分:0)

感谢user743414指出了这是多么简单:) 通过使用字典,我可以引用特定列表。 (这也是一种更快的选择。)

Dictionary<Type,List<HierarchyLevel>> HierarchicalData;

我现在可以将其与'Type'键一起使用:

private void UpdateGeneralData(object Entity, Dictionary<Type,List<HierarchyLevel>> TypeData)
{
    CBType.Items.Clear();
    foreach (var item in TypeData[Entity.GetType()])
    {
        CBType.Items.Add(item);
    }
}

答案 3 :(得分:-1)

类似这样的东西(?):

   List<HierarchyLevel> var = hLevel.Select(h => h.Children.Where(c => c.Param = "desired param")).ToList();