1

我需要加载 2 种类型的 xml 文档;一个有 50 个子孩子,另一个有相同的 50 个和 800 个额外的孩子。较小的文档的性能很好,较大的文档可以接受,直到孩子的数量增加。20k 个孩子 * 50 个子孩子 = 出色的表现,20k 个孩子 * 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

代替 using Descendants,您可以按照直接路径(即 use Elements)吗?这是您避免扫描您知道没有项目的节点的唯一方法。

于 2012-11-28T16:28:56.527 回答
0

XDocument 很方便,但如果问题仅仅是文件很大并且您只需扫描一次,XmlReader 可能是更好的选择。它不会读取整个文件,它一次读取一个节点。您可以手动跳过不感兴趣的部分。

于 2012-11-28T17:33:36.787 回答
0

我认为您可以做的一件事是不要在 Select 上执行 toList 并使其保持惰性,而是返回 Iterable 或 Select 返回的任何内容。(抱歉,我现在没有 Windows 框来测试它) . 当你做 foreach 时,你只会迭代一次(而不是现在两次)

于 2012-11-28T16:07:59.240 回答