C# 如何根据类属性过滤不同的内容?

C# 如何根据类属性过滤不同的内容?,c#,wpf,xml,C#,Wpf,Xml,这是我要做的要点 这是我的英雄课: namespace TomeOfNewerth_WPF_ { public enum HeroType { Agility, Strength, Intelligence } public enum AttackType { Melee, Ranged, } class Hero { public

这是我要做的要点

这是我的英雄课:

namespace TomeOfNewerth_WPF_
{
    public enum HeroType
    {
        Agility,
        Strength,
        Intelligence
    }

    public enum AttackType
    {
        Melee,
        Ranged,
    }

    class Hero
    {
        public string Faction;
        public string Name;
        public HeroType HeroType;
        public string Backstory;
        public double MinimumDamage;
        public double MaximumDamage;
        public double Armor;
        public double MoveSpeed;
        public AttackType AttackType;
        public double AttackRange;
        public double AttackRate;
        public int Strength;
        public int Agility;
        public int Intelligence;
        public string DOTAVersion;

        //Default constructer required for XML serialization.
        public Hero()
        { }

        /// <summary>
        /// This method returns a hero full of the necessary information.
        /// </summary>
        /// <param name="Name">Name of the hero.</param>
        /// <returns>Returns an instace of the Hero class chock full of information.</returns>
        public Hero GetHero(string Name)
        {
            Hero NewHero = new Hero();

            NewHero.Faction = "Legion";
            NewHero.Name = "Andromeda";
            //Yada yada yada. I have to complete this, so disregard it.

            return NewHero;
        }
    }
}
newerth的名称空间_
{
公共枚举类型
{
敏捷性
力量
智力
}
公共枚举攻击类型
{
混战,
范围,
}
阶级英雄
{
公弦派;
公共字符串名称;
公共HeroType HeroType;
公共字符串背景;
公共双重最小损害;
公共双最大损害赔偿;
公共双甲;
公共双速;
公共攻击类型攻击类型;
公众双重攻击范围;
公众双重攻击率;
公共综合实力;
公共信息灵活性;
公共情报;
公众厌恶;
//XML序列化所需的默认构造函数。
公众英雄()
{ }
/// 
///此方法返回一个包含所有必要信息的hero。
/// 
///英雄的名字。
///返回一个充满信息的英雄类实例。
公共英雄GetHero(字符串名称)
{
英雄新英雄=新英雄();
新英雄。派系=“军团”;
NewHero.Name=“仙女座”;
//雅达雅达雅达,我必须完成这件事,所以别理它。
返回新英雄;
}
}
}
该类的每个属性都是一个XML元素。我已经手动将所有信息制表到一个XML文件中,这样我就可以将其反序列化到Hero类中,并将实例转发到任何需要的地方

有一个用例我真的无法理解

我有两个按钮,ViewGood和ViewEvil

英雄类有一个属性叫做派系,我必须过滤掉哪些英雄有善,哪些英雄有恶

我想做什么:

  • 我会有一个循环的方法 通过XML中的每个节点和 返回一个包含所有 与请求的英雄类型匹配的英雄名称

  • 使用这个列表,我可以 做一个foreach,因为所有的英雄 在窗体上具有图像控件 以x:Name作为英雄 名字,我可以做一个。可见= 可见性。全部为False,并将其设置为 忠于世界上每一个英雄的名字 列表有效隐藏每个图像控件 这不在名单上

  • 我想问你们的是,我是不是在做一些完全愚蠢的事情?我真的很想多花点时间,让这个程序有漂亮干净的代码,因为我最想学习

    正如我父亲所说,“坏习惯很容易学会,是好习惯强奸了你。”


    非常感谢。:)

    我不明白。是否要按属性筛选列表

    像这样

    List<Hero> heroes = GetYourHeroes();
    var goodGuys = heroes.Where(hero => hero.Faction == "Jedi");
    
    列出英雄=GetYourHeroes();
    var goodGuys=英雄。Where(英雄=>英雄。派系==“绝地”);
    

    编辑以回答评论:

    你的第二行是否等同于做一个foreach并询问英雄派系=“绝地”

    或多或少,是的。在大多数情况下,它的行为相同,但底层LINQ的行为却截然不同。如果你喜欢这种语法,我建议你阅读一下或者查看一下这个网站上的LINQ问题

    主要的区别是,默认情况下这是懒惰的

    Where(hero=>hero.party==“Jedi”)
    返回一个
    IEnumerable
    ,除非您真的手动或通过将结果转换为列表来迭代枚举数,否则实际上不会执行您想要的操作:

    Where(hero=>hero.section==“绝地”).ToList()可能会做你一开始就想做的事情:这会给你一个已经表示过滤结果的列表


    不过,请记住懒惰,这在以后非常有用,例如,当您构建和嵌套多个类似的“查询”时。

    我不明白。是否要按属性筛选列表

    像这样

    List<Hero> heroes = GetYourHeroes();
    var goodGuys = heroes.Where(hero => hero.Faction == "Jedi");
    
    列出英雄=GetYourHeroes();
    var goodGuys=英雄。Where(英雄=>英雄。派系==“绝地”);
    

    编辑以回答评论:

    你的第二行是否等同于做一个foreach并询问英雄派系=“绝地”

    或多或少,是的。在大多数情况下,它的行为相同,但底层LINQ的行为却截然不同。如果你喜欢这种语法,我建议你阅读一下或者查看一下这个网站上的LINQ问题

    主要的区别是,默认情况下这是懒惰的

    Where(hero=>hero.party==“Jedi”)
    返回一个
    IEnumerable
    ,除非您真的手动或通过将结果转换为列表来迭代枚举数,否则实际上不会执行您想要的操作:

    Where(hero=>hero.section==“绝地”).ToList()可能会做你一开始就想做的事情:这会给你一个已经表示过滤结果的列表


    不过,请记住懒散的一面,它在以后非常有用,例如,当您构建和嵌套多个类似的“查询”时。

    您是否希望对XML执行一些查询?您想要XPath:&

    您想要对XML进行一些查询吗?您需要XPath:&

    在WPF中实现这一点的一种简单方法是使用CollectionView而不是原始列表作为项目源。然后,您可以在此设置一个过滤器,并且您的列表控件将仅显示通过过滤器的项目

    但是,听起来您是在将图像控件直接添加到面板(画布?)中,而不是使用列表控件。在本例中,迭代图像控件并设置其可见性是一种方法。另一种方法是创建一个视图模型类,该类使用显示属性(如可见性)来增强Hero类,并在用户选择不同的视图按钮时更新该可见性。然后,图像控件可以将其Vi数据绑定
    foreach (Hero h in HeroesCollection)
    {
       h.IsVisible = h.Faction == selectedFaction 
          ? Visiblity.Visible 
          : Visibility.Collapsed;
    }