2017-01-19 12 views
1

私はC#を初めて使用しており、少しランダム化を試みています。 mystatus = 1と表示されているseries_titleseries_imageというラベルのあるランダムなノードを選択します。ランダムノードを選択してラベルに追加してください

のXml:

<?xml version="1.0" encoding="UTF-8"?> 
<myanimelist> 
<myinfo> 
    <user_id>5144371</user_id> 
    <user_name>berefin</user_name> 
    <user_watching>116</user_watching> 
    <user_completed>100</user_completed> 
    <user_onhold>3</user_onhold> 
    <user_dropped>0</user_dropped> 
    <user_plantowatch>52</user_plantowatch> 
    <user_days_spent_watching>18.65</user_days_spent_watching> 
</myinfo> 
<anime> 
    <series_title>Cowboy Bebop</series_title> 
    <series_image>https://myanimelist.cdn- dena.com/images/anime/4/19644.jpg</series_image> 
    <my_status>1</my_status> 
</anime> 
<anime> 
    <series_title>Naruto</series_title> 
    <series_image>https://myanimelist.cdn-dena.com/images/anime/13/17405.jpg</series_image> 
    <my_status>1</my_status> 
</anime> 
<anime> 
    <series_title>One Piece</series_title>  
    <series_image>https://myanimelist.cdn-dena.com/images/anime/6/73245.jpg</series_image> 
    <my_status>2</my_status> 
</anime> 

コードこれまで:

private void btnRandom_MouseClick(object sender, MouseEventArgs e) 
    { 
     XmlDocument doc = new XmlDocument(); 
     doc.Load("https://myanimelist.net/malappinfo.php?u=berefin&status=all&type=anime"); 

     XmlNodeList list = doc.SelectNodes("/myanimelist/anime"); 
     //string content = doc.InnerXml; 

     foreach (XmlNode node in list) 
     { 
      // Not sure what to do here 
      Random random = new Random(); 

      string my_status = node["my_status"].InnerText; 


      if (my_status == "1") 
      { 
       string series_title = node["series_title"].InnerText; 
       string series_image = node["series_image"].InnerText; 


      } 
     } 

    } 

がどのように私は、XMLノードとのランダム使用できますか?

答えて

1

2つのアプローチが存在する、私は私が好きなものを説明しますもっと。他の人は、あなたが合っている要素の数を取得し、次に読み込み中に取得する方法を実行します。あなたはランダムから取得した番号のものを見つけるだけです。

同様:配列(リスト)に

Random r = new Random(); 

//some code to get counted elements 

int myOpt = r.Next(CountOfElements); 

// some code to run through elemenets 
if (myOpt == iterator) 
{ 
    //get the details about Anime 
} 

フィル(マテリアライズ)し、その後ランダムにあなたが後で配列にいくつかの作業を行いたい場合は、この1は、理想的な1

を選びます例えば、それを変更するか、何らかの作業をしてください。あなたのオブジェクトの定義で作成されたクラスを作成し、このオブジェクトの配列を作成してからそれを埋めてください。最後は、配列からランダムなエンティティを見つけることです。

クラス定義:リストを充填

public class Anime 
{ 
    public string series_title { get; set; } 
    public string series_image { get; set; } 
    public int my_status { get; set; } 
} 

private void btnRandom_MouseClick(object sender, MouseEventArgs e) 
{ 
    XmlDocument doc = new XmlDocument(); 
    doc.Load("https://myanimelist.net/malappinfo.php?u=berefin&status=all&type=anime"); 
    XmlNodeList list = doc.SelectNodes("/myanimelist/anime"); 
    var arr = new List<Anime>(); 

    foreach (XmlNode node in list) 
    { 
     arr.Add(new Anime() 
     { 
      series_title = node["series_title"].InnerText; 
      series_image = node["series_image"].InnerText; 
      my_status = Convert.ToInt32(node["my_status"].InnerText); 
     } 
    } 

    //here is all Your animes in list -> arr 
} 

最後にあなたは、ランダムに1を選ぶことができます初心者のためのたぶん

public Anime PickRandom(List<Anime> list) 
{ 
    Random random = new Random(); 

    return list[random.Next(list.Count)]; 
} 
+0

すごい、私はこのような大きな答えを期待していなかった、ありがとうございました! – Boninseg

+0

は、正しい答えを作る初心者のためのそれが最も便利でしょう! – Boninseg

+0

@Boninseg、あなただけ頼む追加する何かを持っている場合:-)感謝。 – Tatranskymedved

1

まず、my_statusが1のノードだけを新しいリストにしたいと思うでしょう。あなたのforeachループを使用してこのリストを作成することができます。

次にあなたがこの新しいリストのサイズを取得したいと思う - あなたのケースでは、2次にあなたが使用できるようになります。そこ

int index = random.Next(0, size_of_new_list); 
XmlNode node = size_of_new_list[index]; 
+0

はお時間をありがとうございました!! – Boninseg

1

ないが、これは動作します:

あなたの開始:

XmlDocument doc = new XmlDocument();  
doc.Load("https://myanimelist.net/malappinfo.php?u=berefin&status=all&type=anime"); 
XmlNodeList list = doc.SelectNodes("/myanimelist/anime"); 

が正しいmy_statusのリストを作成します。

var okList = list.Cast<XmlNode>().Where(xn => xn["my_status"].InnerText == "1"); 

oklistの中のアイテムの数まで0から乱数を取得します。

var numOk = okList.Count(); 
Random random = new Random();  
var numChosen = random.Next(numOk); 

この位置で取得ノード:

var node = okList.Skip(numChosen).First(); 

このノードから値を取得します。

string series_title = node["series_title"].InnerText; 
string series_image = node["series_image"].InnerText; 
+0

はお時間をいただき、ありがとうございます!!!!! – Boninseg

関連する問題