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
英雄类有一个属性叫做派系,我必须过滤掉哪些英雄有善,哪些英雄有恶
我想做什么:
非常感谢。:) 我不明白。是否要按属性筛选列表 像这样
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;
}