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>();
}
}
}
}