2016-08-07 13 views
-1

Ich suche eine XML-Datei, aber diese Datei hat 500 Elemente, ich möchte Threads verwenden und einen Thread für jeweils 50 aufeinander folgende Indizes zuweisen, wenn auf die Schaltfläche geklickt wird. Wie kann ich das machen? Hier ist der Suchcode.Multithreading-Suche in einer XML-Datei

private void button1_Click(object sender, EventArgs e) 
     { 
      XmlReader xmlFile; 
      xmlFile = XmlReader.Create("Product.xml", new XmlReaderSettings()); 
      DataSet ds = new DataSet(); 
      DataView dv; 
      ds.ReadXml(xmlFile); 

      dv = new DataView(ds.Tables[0]); 
      dv.Sort = "Product_Name"; 
      int index = dv.Find("Product " + textBox1.Text.ToString()); 

      if (index == -1) 
      { 
       MessageBox.Show("Item Not Found"); 
      } 
      else 
      { 
       MessageBox.Show(dv[index]["Product_Name"].ToString() + " " + dv[index]["Product_Price"].ToString()); 
      } 
     } 

Dies ist ein Artikel in der XML-Datei eingegeben

<Product> 
<Product_id>1</Product_id> 
<Product_name>Product 1</Product_name> 
<Product_price>1000</Product_price> 
</Product> 
+1

Ist es eine praktische oder Erziehungsaufgabe? Es lohnt sich wirklich nicht, wenn das, was du hast, diese winzige Struktur ist. – zerkms

+0

es ist eine pädagogische Aufgabe, ich weiß, dass es nicht wert ist, aber ich muss es erledigen und ich habe gesucht und habe keine Antwort gefunden @zerkms – Nom95715

+0

Was sind die Einschränkungen? Zeit? Erinnerung? Verwendung bestimmter Klassen/Methoden? Multithreading ist obligatorisch? – Mars

Antwort

0

Ich denke, wir brauchen eine XML-Datei, um eine Sammlung von Objekten zu haben, zu analysieren, verwendet dann die Leistung des LINK für die Suche .

class Program 
{ 
    public delegate bool ProcuctComparator(Product elem,string Uservalue); 
    static void Main(string[] args) 
    { 
     UsingXml op = new UsingXml(); 
     string Uservalue = "Product 1"; 
     ProcuctComparator delg = new ProcuctComparator(byProductName); 

     op.parseXml(@"c:\temp\data.xml"); 

     var elem = op.myProducts.Products.AsParallel().Where(f => 
      { 
       return delg(f, Uservalue); 
      }).Count(); 
     Console.WriteLine(elem); 
     Console.ReadKey(); 
    } 
    private static bool byProductName(Product elem, string Uservalue) 
    { 
     return elem.Product_name.Equals(Uservalue); 
    }    

} 
public class UsingXml 
{ 
    public ProductList myProducts { get; set; } 
    public void parseXml(string filePath) 
    { 
     try 
     { 
      FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read); 
      XmlSerializer xmlSer = new XmlSerializer(typeof(ProductList)); 
      myProducts = (ProductList)xmlSer.Deserialize(fs); 
     } 
     catch(Exception ex) 
     { 

       Console.WriteLine(ex.Message); 

     } 
    } 
} 
[XmlRoot("Table")] 
public class ProductList 
{ 
    public ProductList() { } 
    [XmlElement(ElementName = "Product")] 
    public List<Product> Products { get; set; } 
} 
public class Product 
{ 
    public Product() { } 
    [XmlElement(ElementName = "Product_id")] 
    public int Product_id { get; set; } 
    [XmlElement(ElementName = "Product_name")] 
    public string Product_name { get; set; } 
    [XmlElement(ElementName = "Product_price")] 
    public int Product_price { get; set; }  
} 
0

Oder können Sie LINK auf XML verwenden, um ein Element aus einem XML-Dokument zu suchen, da Link zu XML-funktionalem Ansatz Konstruktion verwendet

static void Main(string[] args) 
    { 
     string UserInput = "someCreteria"; 
     using (var xmlStream = new FileStream(@"c:\temp\peoples.xml", FileMode.Open)) 
     { 
      using (var xmlReader = new XmlTextReader(xmlStream)) 
      { 
       XDocument doc = XDocument.Load(xmlReader); 
       var result = doc.Descendants().AsParallel().Where(x => x.Value.Equals(UserInput)).FirstOrDefault(); 
       if (result == null) 
        Console.WriteLine("No item found"); 
       else 
        Console.WriteLine(result.Value.ToString()); 
      } 
     } 
     Console.ReadKey(); 
    }