1

2 種類の xml ドキュメントをロードする必要があります。1 つは 50 のサブ子を持ち、もう 1 つは同じ 50 と 800 の追加の子を持ちます。子の数が増えるまでは、小さなドキュメントでパフォーマンスが優れており、大きなドキュメントで許容範囲内です。20,000 人の子供 * 50 人のサブ子供 = 素晴らしいパフォーマンス、20,000 人の子供 * 850 人のサブ子供 = 遅いパフォーマンス。余分な子孫が存在しない場合、それらの検索をスキップするにはどうすればよいですか? 私の最初の試みは、小さなドキュメントと大きなドキュメントの両方に対して、個別のクラス、メソッド、ビューモデル、およびビューが必要であると考えるようになりました。以下は、私のコードを要約したものです。

public class MyItem
    {
        private string layout;
        private string column;
        private string columnSpan;
        private string row;
        private string rowSpan;
        private string background;

public MyItem(string layout, string column, string columnSpan, string row, string rowSpan, string background)
{
        Layout = layout;
        Column = column;
        ColumnSpan = columnSpan;
        Row = row;
        RowSpan = rowSpan;
        Background = background;
}

public string Layout
    {
        get { return this.layout; }
        set { this.layout = value; }
    }

(非表示 - レイアウトと同じ方法で処理される Column、ColumnSpan、Row、RowSpan、および Background)

この例では、以下に 6 つのサブ子のみを示しています。最初の 2 つのサブ子のみを含む xml ドキュメントをロードする方法を探しています。このようにして、小規模または大規模な xml ドキュメントの両方で必要とされる読み込み方法を使用できます。

internal class myDataSource
{
    //Loads (MyList) xml file 

    public static List<MyItem> Load(string MyListFilename)
    {

        var myfiles = XDocument.Load(MylistFilename).Descendants("item").Select(
            x => new MyItem(
                (string)x.Element("layout"),
                (string)x.Element("column"),
                (string)x.Element("columnSpan"),
                (string)x.Element("row"),
                (string)x.Element("rowSpan"),
                (string)x.Element("background")));

    return myfiles.ToList();
    }

public class MainViewModel : ViewModelBase
{

public void LoadMyList()
        {   

            this.myfiles = new ObservableCollection<MyItemViewModel>();

            List<MyItem> mybaseList = myDataSource.Load(MyListFilename);

            foreach (MyItem myitem in mybaseList)
            {
                this.myfiles.Add(new MyItemViewModel(myitem));
            }


            this.mycollectionView = (ICollectionView)CollectionViewSource.GetDefaultView(myfiles);
            if (this.mycollectionView == null)
                throw new NullReferenceException("mycollectionView");                
        }
}

 public class MyItemViewModel: ViewModelBase
{

    private Models.MyItem myitem;


    public MyItemViewModel(MyItem myitem)
    {
        if (myitem == null)
            throw new NullReferenceException("myitem");

        this.myitem = myitem;
    }      


    public string Layout
    {
        get
        {
            return this.myitem.Layout;
        }
        set
        {
            this.myitem.Layout = value;
            OnPropertyChanged("Layout");
        }
    }

(非表示 - レイアウトと同じ方法で処理される Column、ColumnSpan、Row、RowSpan、および Background)

4

3 に答える 3

1

を使用する代わりにDescendants、ダイレクト パスをたどることができますか (つまり、 を使用しElementsますか)。これが、アイテムがないことがわかっているノードをスキャンしないようにする唯一の方法です。

于 2012-11-28T16:28:56.527 に答える
0

私ができることの1つは、SelectでtoListを実行せず、怠惰な状態に保ち、代わりにIterableを返すか、Selectが返すものを返すことだと思います(申し訳ありませんが、これをテストするためのウィンドウボックスは現在ありません) 。foreachを実行するときは、(現在2回ではなく)1回だけ繰り返します。

于 2012-11-28T16:07:59.240 に答える
0

XDocument は便利ですが、単純にファイルが大きく、1 回スキャンするだけでよいという問題がある場合は、XmlReader の方が適している可能性があります。ファイル全体を読み取るのではなく、一度に 1 つのノードを読み取ります。興味のない部分を手動でスキップできます。

于 2012-11-28T17:33:36.787 に答える