小编Tho*_*que的帖子

从DataTable和自定义IEqualityComparer <DataRow>中删除重复项

我如何实现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()

.net c# linq datatable iequalitycomparer

6
推荐指数
1
解决办法
4359
查看次数

在哪里放置附加属性的XML文档注释?

假设我有一个像这样定义的附加属性:

    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)和访问器(GetMyPropertySetMyProperty)的文档,但我不知道在哪里放置MyClass.MyProperty附加属性的文档,因为它不是一个实际的代码元素.

MSDN库包含此类文档(例如Grid.Row,参见参考资料),因此必须可以......

我应该在哪里放置附加属性的XML文档注释?

c# wpf xml-documentation attached-properties

5
推荐指数
1
解决办法
484
查看次数

Visual Studio NUnit集成

对于某些项目模板(ASP.NET MVC,WPF MVVM app ...),Visual Studio 2008会提示用户是否要创建测试项目:

替代文字

但是,在测试框架列表中,只有"Visual Studio单元测试"可用.我希望能够选择NUnit ......这是可能的,怎么样?

我安装了TestDriven.NET,但它没有改变任何东西......

nunit unit-testing visual-studio-2008

5
推荐指数
1
解决办法
1860
查看次数

重载,泛型类型推断和'params'关键字

我刚注意到一个带有重载决策的奇怪行为.

假设我有以下方法:

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

5
推荐指数
1
解决办法
728
查看次数

WPF - 从ItemsSource中删除项目的最佳方法

我正在编写一个自定义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)

但我对此并不满意,我相信一定有更好的方法.任何建议,将不胜感激 !

wpf itemscontrol itemssource

5
推荐指数
2
解决办法
2万
查看次数

当我的代码都没有显示在堆栈中时,如何调试此错误?

有时我的应用程序中出现以下错误:

无法使用与其父级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)

.net wpf multithreading freezable

5
推荐指数
1
解决办法
1483
查看次数

加载大量数据时,慢速和Stuttery WPF网格滚动(40列,2000行)

简而言之,当加载大量纯数据时,我们无法从任何类型的WPF网格/项目控件中获得合理的滚动性能.

我们使用DevExpress WPF网格创建了一个静态独立原型并将其上传到此处:

http://jump.fm/QOTDL

我们也尝试过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

而且滚动非常恶劣/缓慢.如果您有任何想法,请告诉我们.

.net wpf performance datagrid wpfdatagrid

5
推荐指数
1
解决办法
4307
查看次数

用于批量更新分层表的有效方法

我有一个数据库表,表示文件和目录的层次结构,具有以下结构(简化):

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查询中执行此操作,但如果不可能,我会对其他选项开放,只要它们有效

sql optimization performance hierarchy hierarchical-data

5
推荐指数
1
解决办法
423
查看次数

为所有项目类型注册扩展程序提供程序

我有一个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项目,但仅限于那些......

  • 是否可以使其适用于所有项目类型?
  • 如果没有,我在哪里可以找到其他项目类型的CATID?

c# visual-studio vs-extensibility vsix visual-studio-extensions

5
推荐指数
1
解决办法
387
查看次数

展平嵌套对象以将其属性映射到目标对象

我正在尝试使用 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)

FooDTOHAL资源)

我知道我可以通过像这样显式创建地图来做到这一点:

Mapper.CreateMap<FooDTO, Foo>()
      .ForMember(f => f.Y, c => c.MapFrom(f …
Run Code Online (Sandbox Code Playgroud)

c# hal automapper object-object-mapping

5
推荐指数
1
解决办法
2960
查看次数