C# 如何对数据集中的数据进行排序和选择?

C# 如何对数据集中的数据进行排序和选择?,c#,sorting,dataset,C#,Sorting,Dataset,我曾经对ObservableCollection对象的数据进行排序和选择,如: public class MainViewModel : INotifyPropertyChanged { private ObservableCollection<Module> myModulesList; private void RefreshModulesByOrder() { myModulesList = new ObservableCollecti

我曾经对
ObservableCollection
对象的数据进行排序和选择,如:

public class MainViewModel : INotifyPropertyChanged
{

    private ObservableCollection<Module> myModulesList;
    private void RefreshModulesByOrder()
    {
        myModulesList = new ObservableCollection<Module>(sdb.GetOrderModules().OrderBy(mod => mod.Address));
        ModulesView = CollectionViewSource.GetDefaultView(myModulesList);
        ModulesView.Filter = obj =>
        {
            var Module = (Module)obj;
            return SelectedProduct != null && SelectedProduct.ModelNumber == Module.ModelNumber;
        };
    }

    private DataSet _ds;
    private void RefreshModules()
    {
        _ds = sdb.GetModules();
        _ds.Tables["Modules"].DefaultView.Sort = "Address";
        ModulesView = new ListCollectionView(_ds.Tables["Modules"].DefaultView)
        {
            Filter = obj =>
            {
                var Module = obj as DataRowView;
                return SelectedProduct != null && SelectedProduct.ModelNumber == Module["ModelNumber"].ToString();
            }
        };
    }

    public ushort[] DatagridToArray()
    {
        return _ds.Tables["Modules"].AsEnumerable().Select(mod => mod.Field<UInt16>("ParamValue")).ToArray();
    }

    private Product selectedProduct;
    public Product SelectedProduct
    { 

        get { return selectedProduct; }
        set
        {
            if (selectedProduct != value)
            {
                selectedProduct = value;
                NotifyPropertyChanged();
                RefreshProductList();
                RefreshModules();
                RefreshCommunication();
            }
        }
    }

}
public类主视图模型:INotifyPropertyChanged
{
私有可观察收集myModulesList;
私有void RefreshModulesByOrder()
{
myModulesList=newobserveCollection(sdb.GetOrderModules().OrderBy(mod=>mod.Address));
ModulesView=CollectionViewSource.GetDefaultView(myModulesList);
ModulesView.Filter=obj=>
{
var模块=(模块)obj;
返回SelectedProduct!=null&&SelectedProduct.ModelNumber==Module.ModelNumber;
};
}
私有数据集;
私有模块()
{
_ds=sdb.GetModules();
_ds.Tables[“Modules”].DefaultView.Sort=“Address”;
ModulesView=new ListCollectionView(_ds.Tables[“Modules”].DefaultView)
{
过滤器=对象=>
{
var模块=obj作为DataRowView;
返回SelectedProduct!=null&&SelectedProduct.ModelNumber==Module[“ModelNumber”].ToString();
}
};
}
public ushort[]DatagridToArray()
{
返回_ds.Tables[“Modules”].AsEnumerable().Select(mod=>mod.Field(“ParamValue”).ToArray();
}
私人产品选择产品;
公共产品精选产品
{ 
获取{返回selectedProduct;}
设置
{
如果(selectedProduct!=值)
{
所选产品=价值;
NotifyPropertyChanged();
RefreshProductList();
刷新模块();
刷新通信();
}
}
}
}
这项工作:

registerArray = _ds.Tables["Modules"].AsEnumerable().OrderBy(mod => mod.Field<UInt32>("Address")).Select(mod => mod.Field<UInt16>("ParamValue")).ToArray();
registerArray=_ds.Tables[“Modules”].AsEnumerable().OrderBy(mod=>mod.Field(“Address”).Select(mod=>mod.Field(“ParamValue”).ToArray();

该代码包含大量错误。清除了所有的编译器错误,但是有很多代码丢失。见:

使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Collections.ObjectModel;
使用系统组件模型;
使用系统数据;
使用System.Windows.Data;
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
}
}
公共类MainViewModel:INotifyPropertyChanged
{
公共静态产品选择产品;
静态数据集_ds=null;
静态模块sdb=新模块();
ObservableCollection myModulesList{get;set;}
静态ICollectionView模块视图=空;
公共事件属性更改事件处理程序属性更改;
受保护的虚拟void OnPropertyChanged(字符串propertyName)
{
//见:https://stackoverflow.com/questions/1315621/implementing-inotifypropertychanged-does-a-better-way-exist
}
私有静态无效NotifyPropertyChanged(产品)
{
}
私有void RefreshModulesByOrder()
{
myModulesList=newobserveCollection(sdb.GetOrderModules().OrderBy(mod=>mod.Address));
ModulesView=CollectionViewSource.GetDefaultView(myModulesList);
ModulesView.Filter=obj=>
{
var模块=(模块)obj;
返回selectedProduct!=null&&selectedProduct.ModelNumber==Module.ModelNumber;
};
}
私有静态产品刷新模块()
{
_ds=sdb.GetModules();
_ds.Tables[“Modules”].DefaultView.Sort=“Address”;
ModulesView=new ListCollectionView(_ds.Tables[“Modules”].DefaultView)
{
过滤器=对象=>
{
var模块=obj作为DataRowView;
返回selectedProduct!=null&&selectedProduct.ModelNumber==(int)模块[“ModelNumber”];
}
};
返回null;
}
public ushort[]DatagridToArray()
{
返回_ds.Tables[“Modules”].AsEnumerable().Select(mod=>mod.Field(“ParamValue”).ToArray();
}
公共静态无效RefreshProductList()
{
}
公共静态通信()
{
}
公共类产品
{
公共int模型编号{get;set;}
公共产品精选产品
{
获取{返回selectedProduct;}
设置
{
如果(selectedProduct!=值)
{
所选产品=价值;
NotifyPropertyChanged(本);
RefreshProductList();
刷新模块();
刷新通信();
}
}
}
}
公共类模块
{
公共int模型编号{get;set;}
公共int地址{get;set;}
公共数据集GetModules()
{
返回新数据集();
}
公共列表GetOrderModules()
{
返回新列表();
}
}
}
}

为什么要使用数据集而不是数据表。如果只有一个DataTable,那么通常可以使用DataTable而不是DataSet。对数据表进行排序:dt=dt.AsEnumerable().OrderBy(mod=>mod.Address).CopyToDataTable();源表和目标表必须具有相同的架构才能工作。您的示例代码只选择了一列mod.ParamValue,这将无法与DataTable一起使用。我已经有了一个排序后的DataTable作为上面的更新,现在我需要通过方法
DatagridToArray()
.var results=_ds.Tables[“Modules”].AsEnumerable().Select(x=>x.Field(“cola”).ToArray()获取一个特定的列值;很好,谢谢你的回答!这会将xml文件中的所有
ParamValue
放入Arra
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Data;
using System.Windows.Data;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
        }
    }
    public class MainViewModel :  INotifyPropertyChanged
    {

        public static Product selectedProduct;
        static DataSet _ds = null;
        static Module sdb = new Module();
        ObservableCollection<Module> myModulesList { get; set; }
        static ICollectionView ModulesView = null;

        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void OnPropertyChanged(string propertyName)
        {
            //see : https://stackoverflow.com/questions/1315621/implementing-inotifypropertychanged-does-a-better-way-exist

        }
        private static void NotifyPropertyChanged(Product product)
        {
        }
        private void RefreshModulesByOrder()
        {

            myModulesList = new ObservableCollection<Module>(sdb.GetOrderModules().OrderBy(mod => mod.Address));
            ModulesView = CollectionViewSource.GetDefaultView(myModulesList);
            ModulesView.Filter = obj =>
            {
                var Module = (Module)obj;
                return selectedProduct != null && selectedProduct.ModelNumber == Module.ModelNumber;
            };
        }

        private static Product RefreshModules()
        {
            _ds = sdb.GetModules();
            _ds.Tables["Modules"].DefaultView.Sort = "Address";
            ModulesView = new ListCollectionView(_ds.Tables["Modules"].DefaultView)
            {
                Filter = obj =>
                {
                    var Module = obj as DataRowView;
                    return selectedProduct != null && selectedProduct.ModelNumber == (int)Module["ModelNumber"];
                }
            };
            return null;
        }

        public ushort[] DatagridToArray()
        {
            return _ds.Tables["Modules"].AsEnumerable().Select(mod => mod.Field<UInt16>("ParamValue")).ToArray();
        }
        public static void RefreshProductList()
        {
        }
        public static void RefreshCommunication()
        {
        }
        public class Product
        {
            public int ModelNumber { get; set; }
            public Product SelectedProduct
            {

                get { return selectedProduct; }
                set
                {
                    if (selectedProduct != value)
                    {
                        selectedProduct = value;
                        NotifyPropertyChanged(this);
                        RefreshProductList();
                        RefreshModules();
                        RefreshCommunication();
                    }
                }
            }
        }
        public class Module
        {
            public int ModelNumber { get; set; }
            public int Address { get; set; }
            public DataSet GetModules()
            {
                return new DataSet();
            }
            public List<Module> GetOrderModules()
            {
                return new List<Module>();
            }
        }
    }
}