我如何实现IEqualityComparer<DataRow>从DataTable下一个结构中删除重复行:
ID primary key, col_1, col_2, col_3, col_4
Run Code Online (Sandbox Code Playgroud)
默认比较器不起作用,因为每行都有自己唯一的主键.
如何实现IEqualityComparer<DataRow>将跳过主键并仅比较剩余的数据.
我有这样的事情:
public class DataRowComparer : IEqualityComparer<DataRow>
{
public bool Equals(DataRow x, DataRow y)
{
return
x.ItemArray.Except(new object[] { x[x.Table.PrimaryKey[0].ColumnName] }) ==
y.ItemArray.Except(new object[] { y[y.Table.PrimaryKey[0].ColumnName] });
}
public int GetHashCode(DataRow obj)
{
return obj.ToString().GetHashCode();
}
}
Run Code Online (Sandbox Code Playgroud)
和
public static DataTable RemoveDuplicates(this DataTable table)
{
return
(table.Rows.Count > 0) ?
table.AsEnumerable().Distinct(new DataRowComparer()).CopyToDataTable() :
table;
}
Run Code Online (Sandbox Code Playgroud)
但它只打电话GetHashCode()而不打电话Equals()
假设我有一个像这样定义的附加属性:
public static string GetMyProperty(DependencyObject obj)
{
return (string)obj.GetValue(MyPropertyProperty);
}
public static void SetMyProperty(DependencyObject obj, string value)
{
obj.SetValue(MyPropertyProperty, value);
}
// Using a DependencyProperty as the backing store for MyProperty. This enables animation, styling, binding, etc...
public static readonly DependencyProperty MyPropertyProperty =
DependencyProperty.RegisterAttached("MyProperty", typeof(string), typeof(MyClass), new UIPropertyMetadata(0));
Run Code Online (Sandbox Code Playgroud)
我可以编写属性identifier(MyPropertyProperty)和访问器(GetMyProperty和SetMyProperty)的文档,但我不知道在哪里放置MyClass.MyProperty附加属性的文档,因为它不是一个实际的代码元素.
MSDN库包含此类文档(例如Grid.Row,参见参考资料),因此必须可以......
我应该在哪里放置附加属性的XML文档注释?
对于某些项目模板(ASP.NET MVC,WPF MVVM app ...),Visual Studio 2008会提示用户是否要创建测试项目:

但是,在测试框架列表中,只有"Visual Studio单元测试"可用.我希望能够选择NUnit ......这是可能的,怎么样?
我安装了TestDriven.NET,但它没有改变任何东西......
我刚注意到一个带有重载决策的奇怪行为.
假设我有以下方法:
public static void DoSomething<T>(IEnumerable<T> items)
{
// Whatever
// For debugging
Console.WriteLine("DoSomething<T>(IEnumerable<T> items)");
}
Run Code Online (Sandbox Code Playgroud)
现在,我知道通常会使用少量显式参数调用此方法,因此为方便起见,我添加了此重载:
public static void DoSomething<T>(params T[] items)
{
// Whatever
// For debugging
Console.WriteLine("DoSomething<T>(params T[] items)");
}
Run Code Online (Sandbox Code Playgroud)
现在我尝试调用这些方法:
var items = new List<string> { "foo", "bar" };
DoSomething(items);
DoSomething("foo", "bar");
Run Code Online (Sandbox Code Playgroud)
但在这两种情况下,params都会调用重载.我希望IEnumerable<T>在a的情况下调用重载List<T>,因为它似乎是一个更好的匹配(至少对我而言).
这种行为是否正常?谁能解释一下呢?我在MSDN文档中找不到任何关于它的明确信息......这里涉及的重载决策规则是什么?
c# generics type-inference params-keyword overload-resolution
我正在编写一个自定义ItemsControl(标签式文档容器),当用户关闭它时,每个项目(选项卡)都可以从UI中删除.但是,我不能直接从ItemsControl.Items集合中删除它,因为这些项可以是数据绑定.所以,我必须从删除它ItemsSource,它可以是任何东西(ICollection,DataTable,DataSourceProvider...).
在我的应用程序的上下文中,我知道它的实际类型是什么ItemsSource,但我希望该控件更通用,以便我可以在以后重用它.
所以我正在寻找一种从数据源中删除项目的方法,而不知道它的类型.我可以使用反射,但感觉很脏......到目前为止,我想出的最佳解决方案是使用dynamic:
internal void CloseTab(TabDocumentContainerItem tabDocumentContainerItem)
{
// TODO prompt user for confirmation (CancelEventHandler ?)
var item = ItemContainerGenerator.ItemFromContainer(tabDocumentContainerItem);
// TODO find a better way...
try
{
dynamic items = ItemsSource;
dynamic it = item;
items.Remove(it);
}
catch(RuntimeBinderException ex)
{
Trace.TraceError("Oops... " + ex.ToString());
}
}
Run Code Online (Sandbox Code Playgroud)
但我对此并不满意,我相信一定有更好的方法.任何建议,将不胜感激 !
有时我的应用程序中出现以下错误:
无法使用与其父级Freezable属于不同线程的DependencyObject
我知道如何解决这种错误,但是在那种情况下,我不知道它在哪里发生,所以我不知道要解决什么...异常的堆栈跟踪仅包含.NET Framework代码,而不包含我的代码(除了Main方法):
at System.Windows.Freezable.EnsureConsistentDispatchers(DependencyObject owner, DependencyObject child)
at System.Windows.Freezable.OnFreezablePropertyChanged(DependencyObject oldValue, DependencyObject newValue, DependencyProperty property)
at System.Windows.Freezable.OnFreezablePropertyChanged(DependencyObject oldValue, DependencyObject newValue)
at System.Windows.Media.RenderData.PropagateChangedHandler(EventHandler handler, Boolean adding)
at System.Windows.UIElement.RenderClose(IDrawingContent newContent)
at System.Windows.Media.VisualDrawingContext.CloseCore(RenderData renderData)
at System.Windows.Media.RenderDataDrawingContext.DisposeCore()
at System.Windows.Media.DrawingContext.System.IDisposable.Dispose()
at System.Windows.Media.RenderDataDrawingContext.Close()
at System.Windows.UIElement.Arrange(Rect finalRect)
at MS.Internal.Helper.ArrangeElementWithSingleChild(UIElement element, Size arrangeSize)
at System.Windows.Controls.ContentPresenter.ArrangeOverride(Size arrangeSize)
at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect)
at System.Windows.UIElement.Arrange(Rect finalRect)
at System.Windows.Controls.WrapPanel.arrangeLine(Double v, Double lineV, Int32 start, Int32 end, Boolean useItemU, Double itemU)
at System.Windows.Controls.WrapPanel.ArrangeOverride(Size finalSize)
at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect)
at System.Windows.UIElement.Arrange(Rect finalRect)
at …Run Code Online (Sandbox Code Playgroud) 简而言之,当加载大量纯数据时,我们无法从任何类型的WPF网格/项目控件中获得合理的滚动性能.
我们使用DevExpress WPF网格创建了一个静态独立原型并将其上传到此处:
我们也尝试过Infragistics和Xceed网格,问题是一样的.
看起来WPF根本无法处理显示大量数据的合理大数据网格,只要提供流畅的用户体验即可.即使没有任何类型的数据绑定,只需提供静态数据(大约40列,2000行),滚动即可.在最低级别,分析器似乎表明除了大量垃圾收集之外还会发生过量的"测量",这可能是不规则口吃的原因.
原型中的代码可以轻松替换为与其他网格一起使用.如果有人能够在场景中产生平滑的滚动体验,特别是在数据分组在多个级别并且密集的情况下,请告诉我们,我们非常有兴趣听取您的意见.
额外细节:
我们正在创建2000个对象(每个具有约40个属性),并将它们分配给网格的数据源属性.
我们的每个对象都表示为类似于下面的类:
public class RowViewModel
{
public double AskAsw { get; set; }
public string AskBmkName { get; set; }
public double AskBmkPrice { get; set; }
public double AskBmkSprd { get; set; }
... and so on
}
Run Code Online (Sandbox Code Playgroud)
这些是创建的,并添加到集合/列表中,如下所示:
for (int i = 1; i < 2000; i++)
{
_rowViewModels.Add(new RowViewModel(i));
}
Run Code Online (Sandbox Code Playgroud)
然后绑定到datagrid.很简单:
gridControl.DataSource = _rowViewModels;
Run Code Online (Sandbox Code Playgroud)
这导致数据网格显示此信息.我们将字体缩小(10px,根据用户的要求),并自动调整大小并对列进行分组.结果看起来与此类似:
http://i54.tinypic.com/21jt11t.png
而且滚动非常恶劣/缓慢.如果您有任何想法,请告诉我们.
我有一个数据库表,表示文件和目录的层次结构,具有以下结构(简化):
ItemId int Path text Type int (0 for files, 1 for directories) ParentId int BackupTime datetime
目前该BackupTime列仅用于文件,目录设置为null.
现在我需要为目录填充此列:它必须是BackupTime所有后代(文件和目录)中的最小值.
这个(天真和低效)的查询说明了我想要做的事情:
update Items i
set BackupTime = (select min(BackupTime)
from Items d
where d.Path like i.Path || '%'
and d.Type = 0)
where i.Type = 1
Run Code Online (Sandbox Code Playgroud)
我的问题是我似乎找不到有效的方法.上面的查询对大量数据需要太长时间(此表通常包含超过100K行)
min(BackupTime)只搜索直接孩子可能会更快:
update Items i
set BackupTime = (select min(BackupTime)
from Items d
where d.ParentId = i.ItemId)
where i.Type = 1
Run Code Online (Sandbox Code Playgroud)
但为了实现这一点,我必须确保后代将在他们的祖先之前更新,所以我必须从下往上递归地遍历层次结构.问题是我没有简单的方法知道哪些项目是层次结构中最深的.我正在使用SQLite,所以我不能使用分层查询.
有关如何有效地做到这一点的任何想法?
理想情况下,我希望能够在单个UPDATE查询中执行此操作,但如果不可能,我会对其他选项开放,只要它们有效
我有一个Visual Studio扩展,它将属性添加到项目项的属性网格中.这是通过注册这样的扩展程序提供程序来完成的:
void RegisterExtenderProvider()
{
var provider = new PropertyExtenderProvider(_dte, this);
string name = PropertyExtenderProvider.ExtenderName;
RegisterExtenderProvider(VSConstants.CATID.CSharpFileProperties_string, name, provider);
RegisterExtenderProvider(VSConstants.CATID.VBFileProperties_string, name, provider);
}
void RegisterExtenderProvider(string extenderCatId, string name, IExtenderProvider extenderProvider)
{
int cookie = _dte.ObjectExtenders.RegisterExtenderProvider(extenderCatId, name, extenderProvider);
_registerExtenderProviders.Add(cookie, extenderProvider);
}
Run Code Online (Sandbox Code Playgroud)
它适用于C#和VB项目,但仅限于那些......
c# visual-studio vs-extensibility vsix visual-studio-extensions
我正在尝试使用 AutoMapper 来映射这样的类:
class FooDTO
{
public int X { get; set; }
public EmbeddedDTO Embedded { get; set; }
public class EmbeddedDTO
{
public BarDTO Y { get; set; }
public BazDTO Z { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
对于这样的类:
class Foo
{
public int X { get; set; }
public Bar Y { get; set; }
public Baz Z { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
(FooDTO是HAL资源)
我知道我可以通过像这样显式创建地图来做到这一点:
Mapper.CreateMap<FooDTO, Foo>()
.ForMember(f => f.Y, c => c.MapFrom(f …Run Code Online (Sandbox Code Playgroud) c# ×5
wpf ×4
.net ×3
performance ×2
automapper ×1
datagrid ×1
datatable ×1
freezable ×1
generics ×1
hal ×1
hierarchy ×1
itemscontrol ×1
itemssource ×1
linq ×1
nunit ×1
optimization ×1
sql ×1
unit-testing ×1
vsix ×1
wpfdatagrid ×1