0

LINQはよくわかりません。私が見つけたすべての例は、なぜLINQを使用するのかわからないほど単純化されているか、複雑すぎて、LINQがどのように機能するかを理解する必要があります。

ですから、これにLINQを使用するかどうか、またどのように使用するのか疑問に思います...この例では、プレーヤークラスのリストがあり、各クラス内に能力のリストがあるとします。各能力にはレベル要件があります。LINQを使用して、特定のクラスのセットに対して特定のレベル以下のすべての能力を選択するにはどうすればよいですか?

このデータを与える:

  • クラス1
    • 能力1-レベル1-
    • 能力2-レベル5
    • 能力3-レベル9
  • クラス2
    • 能力4-レベル1-
    • 能力5-レベル2
    • 能力6-レベル6
  • クラス3
    • 能力7-レベル2
    • 能力8-レベル4
    • 能力9-レベル6

レベル5以下のクラス1とクラス3のすべての能力のリストが欲しいです。結果は{Ability1、Ability2、Ability7、Ability8}になります。

public class Class1
{

  public class Ability
  {
    public string Name { get; set; }
    public int Level { get; set; }
  }

  public class PlayerClass
  {
    public string Name { get; set; }
    public List<Ability> Abilities { get; set; }
  }

  public List<PlayerClass> Classes { get; set; }

  public Class1()
  {
    PlayerClass oClass;

    Classes = new List<PlayerClass>();

    oClass = new PlayerClass();
    oClass.Name = "Class1";
    oClass.Abilities = new List<Ability>();
    oClass.Abilities.Add(new Ability() { Name = "Ability1", Level = 1 });
    oClass.Abilities.Add(new Ability() { Name = "Ability2", Level = 5 });
    oClass.Abilities.Add(new Ability() { Name = "Ability3", Level = 9 });
    Classes.Add(oClass);

    oClass = new PlayerClass();
    oClass.Name = "Class2";
    oClass.Abilities = new List<Ability>();
    oClass.Abilities.Add(new Ability() { Name = "Ability4", Level = 1 });
    oClass.Abilities.Add(new Ability() { Name = "Ability5", Level = 2 });
    oClass.Abilities.Add(new Ability() { Name = "Ability6", Level = 6 });
    Classes.Add(oClass);

    oClass = new PlayerClass();
    oClass.Name = "Class3";
    oClass.Abilities = new List<Ability>();
    oClass.Abilities.Add(new Ability() { Name = "Ability7", Level = 2 });
    oClass.Abilities.Add(new Ability() { Name = "Ability8", Level = 4 });
    oClass.Abilities.Add(new Ability() { Name = "Ability9", Level = 6 });
    Classes.Add(oClass);

    IEnumerable<Ability> Abilities = 
                   GetAbilitiesForClasses("Class1;Class3".Split(';'), 5);
    //Abilities should contain Ability1, Ability2, Ability7, Ability8
  }

  public IEnumerable<Ability> GetAbilitiesForClasses
       (string[] asClassNames, int iLevel)
  {
    // TODO: Use LINQ to return the abilities for the class names 
           //contained in asClassNames that are at or below level: iLevel
    return null;
  }
}
4

4 に答える 4

3
public IEnumerable<Ability> GetAbilitiesForClasses(string[] asClassNames, int iLevel)
{
    return Classes
           .Where(X => asClassNames.Contains(X.Name))
           .SelectMany(X => X.Abilities)
           .Where(X => X.Level <= iLevel)
           .ToList();
}
于 2012-09-07T14:36:53.927 に答える
3

プレーヤークラスが次のタイプのプロパティをPlayerClass持つクラスで表されていると仮定します。AbilitiesIDictionary<string, int>

List<PlayerClass> classes = ...
var results =
    from c in classes
    where c.Name == "Class1" || c.Name == "Class2"
    from ab in c.Abilities // ab is of type KeyValuePair<string, int>
    where ab.Value <= 5
    select ab.Key;

ただし、プロパティを使用してAbilityクラスを定義することをお勧めします。その場合、プロパティは:になります。NameLevelAbilitiesIList<Ability>

List<PlayerClass> classes = ...
var results =
    from c in classes
    where c.Name == "Class1" || c.Name == "Class2"
    from ab in c.Abilities
    where ab.Level <= 5
    select ab.Name;
于 2012-09-07T14:40:05.263 に答える
1

アビリティを保存するだけの場合は、それらを1つの構造に統合して、実行できるクラスのリストを作成できますLINQ

例えば:

public List<AbilityClass> Abilities { get; set; }

LINQ:

 var level9Abilities = (from a in Abilities
                    where.Level == "Level 9"
                 // where a.Level > 9 (if Level is an int)
                  select a).ToList();


 foreach (var lvl in level9Abilities) {
      Console.WriteLine(lvl);
 }
于 2012-09-07T14:37:36.900 に答える
1

あなたは使用することができますSelectMany、仮定:

 public class Class
{
    public List<Ability> Abilities { get; set; }
}

public class Ability
{
    public string Name { get; set; }
    public int Level { get; set; }
}

Linqを使用する:

var classes = new List<Class>() {class1, class3};

var output = classes.SelectMany(c => c.Abilities)
            .Where(a => a.Level <= 5);
于 2012-09-07T14:39:45.383 に答える