小编Dzy*_*ann的帖子

返回括号之间的值列表(10,20,30,40)?

我在Visual Studio 2012中使用C++(而不是C++/CLI).

我不明白为什么这段代码有效,我原本以为它会在编译时失败,但它在运行时甚至都不会失败:

double MyClass::MyMethod() const
{
    //some code here        
    return (10, 20, 30, 40);
}
Run Code Online (Sandbox Code Playgroud)

我错误地制作了这段代码,不是故意的,我在运行单元测试时注意到了这个错误.我很惊讶它有效.当我运行它时,它返回40,列表中的最后一个数字.

有人能解释一下这种语法的含义及其工作原理吗?

c++ comma-operator

4
推荐指数
1
解决办法
488
查看次数

与单词列表不匹配的单词的正则表达式

我需要一个正则表达式来匹配不在我拥有的特定列表中的单词。

这是我没有制作的系统,但我需要用于过滤。显然它根据给定的正则表达式过滤字段,字段只包含一个单词。所以我想要全字匹配。

例如,我想要番茄或土豆以外的任何单词,我的正则表达式:

^(?!(Potato|Tomato))
Run Code Online (Sandbox Code Playgroud)

我在这里测试我的正则表达式。当我输入Potato 时,我得到:

您的模式与主题字符串不匹配。

这是我期望的结果,但是每当我输入番茄和马铃薯以外的任何其他内容时,例如“巧克力”,我都会得到:

没有提取匹配组。

这意味着您的模式匹配,但其中没有 (capturing (groups)) 匹配主题字符串中的任何内容。

我试着把我的表达改为:

([[:alnum:]])*^(?!(Potato|Tomato))
Run Code Online (Sandbox Code Playgroud)

意思是,我想要除“Tomato”和“Potato”之外的任何字母数字字符组合,但我得到相同的结果。

我不知道如何更改我的正则表达式,因此它有一个符合我需要的捕获组

regex regex-negation

4
推荐指数
1
解决办法
6417
查看次数

如何获取 IList 项的基础类型?

我有一个接收IList. 有没有办法获得项目的类型IList

public void MyMethod(IList myList)
{
}
Run Code Online (Sandbox Code Playgroud)

我有一个类,您可以将 IList 关联到它,您也可以添加一个 NewItem 函数,但我希望能够使用默认的空构造函数添加项目,以防用户未设置 NewItem 函数。

如何获取基础项目的类型?如果它是IList<T>,我会知道该怎么做,但我无法更改 API,因为我可以接收任何类型的实现 IList 的集合,唯一的限制是代码中没有强制执行的所有项目我们收到的集合是相同类型的。

c# reflection

4
推荐指数
2
解决办法
5868
查看次数

在ItemsControl中绑定上下文菜单?

如何将ContextMenu添加到ItemsControl,其中:

  • ItemsControl的ItemsSource位于包含ItemsControl的UserControl的ViewModel中
  • Context Menu的CommandParameter是绑定到ItemsControl中Item的ViewModel.

我遵循这种方法.但是,我有一个Command,它从绑定到ItemsControl的ObservableCollection中删除项目.发生这种情况时,会在RelayCommand中抛出异常.在我看来,ContextMenu不是"隐藏",所以它试图为其命令评估"CanExecute",但是当项目被删除时,它不能在RelayCommand的CanExecute方法中将参数强制转换为"T"类.

我想知道如何完成我需要的正确方法.


到目前为止我的实施:

MainViewModel

public class MainViewModel
{
    public ObservableCollection<MyContextMenuClass> ContextMenuItems{ get;set; }
    public ObservableCollection<MyItemClass> MyItems{ get;set; }

    public void AddItem(MyItemClass item)
    {
        MyItems.Add(item);
    }

    public void AddContextMenuItem(MyContextMenuClass item)
    {
        ContextMenuItems.Add(item);
    }

    public MainViewModel(IList<MyItemClass> myItems, IList<MyContextMenuClass> myContextualMenuItems)
    {
        MyItems.AddRange(myItems);
        ContextMenuItems.AddRange(myContextualMenuItems);
    }

    public MainViewModel()
    {}
}
Run Code Online (Sandbox Code Playgroud)

MyItemClass

public class MyItemClass
{
    public string MyText{get;set;}
}
Run Code Online (Sandbox Code Playgroud)

MyContextMenuClass

public class MyContextMenuClass 
{
    public RecentContextMenuItem()
    {}
    public string Caption{get;set;}

    public RelayCommand<MyItemClass> Command{get;set;}        
}
Run Code Online (Sandbox Code Playgroud)

我的UserControl(DataContext = MainViewModel)

<UserControl …
Run Code Online (Sandbox Code Playgroud)

c# wpf contextmenu

3
推荐指数
1
解决办法
3091
查看次数

重载==并与nullptr进行比较?

我正在编写C++ Native Static Library的C++/CLI包装器.

我对C++/CLI或C++没有多少经验.我已经按照我在互联网上阅读的最佳实践来创建C++/CLI包装器.我的包装器有一个指向C++类的指针.我的C++有运算符==重载.

我试图在我的包装器中重载它并使用C++类的实现,但是当包装器为null时我遇到错误.

我搜索了如何知道我的句柄是否为空,我发现你必须将它与nullptr进行比较.

我在C++/CLI中有这个方法

       MyOtherClass const* MyClass::MyMethod(MyWrapper^ instance)   
    {
        if(instance == nullptr)
        {
           return NULL;
        }

        return instance->Property;      
    }
Run Code Online (Sandbox Code Playgroud)

if(instance == nullptr)调用我的==运算符的重载实现.

      static bool operator==(MyWrapper^ a, MyWrapper^ b)
    {
        return a->InternalInstance == b->InternalInstance; //Here System.AccessViolationException Exception
    }
Run Code Online (Sandbox Code Playgroud)

问题是如果a为null,则会抛出System.AccessViolationException异常.

我不能简单地为ab添加与nullptr的比较,因为它会创建堆栈溢出.

static bool operator==(MyWrapper^ a, MyWrapper^ b)
{
    if(a == nullptr && b == nullptr) //Stack Overflow here because a == nullptr calls this method again.
        return true; …
Run Code Online (Sandbox Code Playgroud)

c++ c++-cli

3
推荐指数
1
解决办法
3428
查看次数

在C++中返回Vector相当于c#

我有很多C#代码,我必须用C++编写.我在C++方面没有太多经验.

我正在使用Visual Studio 2012来构建.该项目是C++中静态库(不是在C++/CLI中).

我知道这是一个基本问题,但我一直在阅读,我感到很困惑.在C#代码中,他们在几个地方使用了double []数组,从他们使用它们的方式来看,我看到在C++中替换它们的最好方法是使用vector.

C#中有一些属性可以返回数组的副本,我想在C++中做同样的事情.

注意:myArray是MyClass的成员.

C#

public double[] MyArray
    {
        get
        {
            /*** Some Code Here ***/
            double[] myCloneArray= (double[])myArray.Clone();
            return myCloneArray;
        }
    }
Run Code Online (Sandbox Code Playgroud)

我想在C++中完成类似的事情,但最大限度地减少创建的副本数量.这是正确的吗?

C++

vector<double> MyClass::GetMyArray()
{   
      /*** Some Code Here ***/
      vector<double> myCloneArray= vector<double>(myArray);
      return myCloneArray;  
}
Run Code Online (Sandbox Code Playgroud)

我只想创建一个myArray副本.由于我没有返回引用,我的理解是,在返回myCloneArray时,将创建它的副本.这总是如此吗?

我想确定,所以我在互联网上阅读,但我很困惑,因为有些人说有些编译器不这样做.

我想确保我总是发送副本,而不是相同的向量.我现在正在使用编译器,但最终我的代码也将在其他编译器中构建,所以我需要确保这不依赖于编译器

这是我能走的最好的方式吗?或者我可以减少代码,像这样:

C++

vector<double> MyClass::GetMyArray()
{   
      /*** Some Code Here ***/
      return myArray;   
}
Run Code Online (Sandbox Code Playgroud)

并且将调用vector(myArray)的复制构造函数?

c++ vector

2
推荐指数
1
解决办法
1375
查看次数

如何知道我的DependencyProperty是否设置为NULL?

我有一个带有几个DependencyProperties的WPF用户控件.

如果用户将"null"绑定到我的DependencyProperties之一,我希望能够执行某些操作,例如将值更改为有效的值.

问题是我的属性的默认值是NULL,当它们为该属性设置NULL时,OnPropertyChanged不会触发.

有没有办法实现我想要的,除了将我的属性的默认值更改为除NULL以外的其他内容?我需要创建一些"模拟"值来设置为默认值

c# wpf

2
推荐指数
1
解决办法
1453
查看次数

当你不需要在oracle中关闭游标时?

我在使用TOAD的Oracle 10.2中工作.

我有一个类似于这样的脚本:

DECLARE

my_query VARCHAR2(500) := 'select C1, C2, C3 FROM  MYSCHEMA.MYTABLE';

    TYPE my_record_type IS RECORD
    (
           C1 MYTABLE.C1%TYPE,
           C2 MYTABLE.C2%TYPE,           
           C3 MYTABLE.C3%TYPE
    );

    TYPE my_table_type IS TABLE OF my_record_type;
    my_records my_table_type;

     my_cursor SYS_REFCURSOR;
BEGIN
     OPEN my_cursor FOR my_records;
        FETCH my_cursor
        BULK COLLECT INTO my_records
        LIMIT 1000;                           

        FOR indx IN 1 .. my_records.COUNT
        LOOP

            /* SOME CODE HERE*/
            IF /* CONDITION */ THEN
                EXIT;
            END IF; 
        END LOOP;
    CLOSE my_cursor;
END;
Run Code Online (Sandbox Code Playgroud)

我已经读过,如果你关闭一个已经关闭的游标,oracle将引发INVALID_CURSOR异常.

我还读过,当你在FOR LOOP中使用CURSOR时,oracle会在LOOP结束时显式关闭游标.所以在理论上我不需要像我一样关闭光标,我应该得到一个例外,我不是.

现在我需要在LOOP中添加一个条件,它将导致它退出LOOP.我读到当你在FOR …

oracle

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

如何知道SQL PLUS中的SET是什么?

SQL Plus中有没有办法知道所有SET命令的状态?

例如,WRAP是否设置为OFF或ON等.

我在网上搜索过,找不到任何东西.我也认为它可能类似于CMD中的SET,但是如果你试试这个:

SET
Run Code Online (Sandbox Code Playgroud)

你得到:

SP2-0545:SET命令需要参数.

如何获得所有当前SET的值?

如果我不清楚,我想知道是否有类似这样的命令:

SHOW SETS
Run Code Online (Sandbox Code Playgroud)

这将返回类似的东西

WRAP ON 
LONG 3000
LINESIZE 344
VERIFY OFF
etc..
Run Code Online (Sandbox Code Playgroud)

oracle sqlplus

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

没有数据时无效尝试读取

这是我的代码:

 db.Open();

 string updateString = "SELECT TOP 1 RTRIM(kol) kol, RTRIM(adres) adres, RTRIM(numwave) numwave FROM sorters WHERE kodprod=@kodprod AND sorter_kod=@sorter AND moved_ok IS NULL ORDER BY CAST(kol as int)";
 try
 {
     SqlCommand command = new SqlCommand(updateString, db);
     //command.Parameters.AddWithValue("@numdoc", NumDoc);
     command.Parameters.AddWithValue("@kodprod", KodProd.Id);
     command.Parameters.AddWithValue("@sorter", SorterKod);
     SqlDataReader reader = command.ExecuteReader();
     reader.Read();//here error
     Kol = reader["kol"].ToString();
     Adres = reader["adres"].ToString();
     NumWave = reader["numwave"].ToString();
     NumDoc = reader["numdoc"].ToString();
     reader.Close();
  }
  catch (Exception ex)
  { }
Run Code Online (Sandbox Code Playgroud)

运行代码时为什么会出现此错误?:

没有数据时无效尝试读取

c#

0
推荐指数
1
解决办法
114
查看次数