在我们的应用程序中,一个实体必须由枚举表示:例如类型,类别,状态等等.
通常,代码中存在使用值来决定一个动作或另一个动作的条件或流程,因此必须以某种方式为应用程序"知道"值(即它必须能够引用特定实例)决定而不是引用整体的类).这就是我们使用枚举而不仅仅是常规类的原因.
问题是这些实体还需要作为其他实体的字段存储(或至少引用)在数据库中.我们通常为每个实体创建一个表,能够在这些列中进行参考完整性检查,并且数据在数据库中只具有"含义",而无需参考枚举来找出每个id的含义.
理想情况下,应该从枚举中的数据填充这些实体的数据,但是现在我们在db初始化脚本中重复了这些值.
当使用像Hibernate这样的ORM时,它会变得有点复杂.
我想知道其他人是如何处理这种情况的.
我对枚举和数据库表之间有重复的想法不太满意,但我还没有找到更好的解决方案.
我有2个 IEnumerable<int>
IEnumerable<int> x;
IEnumerable<int> y;
Run Code Online (Sandbox Code Playgroud)
确定x中是否存在任何int的最佳方法是什么?
目前我正在使用:
return x.Intersect<int>(y).Count() > 0;
Run Code Online (Sandbox Code Playgroud)
是否可以明显更快地循环并单独测试每个?
foreach (int i in x)
{
foreach (int j in y)
{
if (i == j) return true;
}
}
return false;
Run Code Online (Sandbox Code Playgroud)
列表相对较轻,如果在考虑中重要,则x中不超过50个,y中不超过4个.
我将在Python中实现一个tokenizer,我想知道你是否可以提供一些样式建议?
我之前在C和Java中实现了一个标记化器,所以我对理论很好,我只想确保我遵循pythonic样式和最佳实践.
列出令牌类型:
例如,在Java中,我会有一个像这样的字段列表:
public static final int TOKEN_INTEGER = 0
Run Code Online (Sandbox Code Playgroud)
但是,显然,我没有办法(我认为)在Python中声明一个常量变量,所以我可以用普通的变量声明替换它,但这并没有让我成为一个很好的解决方案,因为声明可能会被改变.
从Tokenizer返回令牌:
有没有更好的替代方案,只需返回一个元组列表,例如
[ (TOKEN_INTEGER, 17), (TOKEN_STRING, "Sixteen")]?
Run Code Online (Sandbox Code Playgroud)
干杯,
皮特
这个问题对于嵌入式开发尤为重要.异常处理为生成的二进制输出增加了一些空间.另一方面,没有例外,错误需要以其他方式处理,这需要额外的代码,这最终也会增加二进制大小.
我对你的经历很感兴趣,特别是:
请仅以我的问题为指导.欢迎任何输入.
附录:对于特定的C++对象/可执行文件,是否有任何人具有具体的方法/脚本/工具,它将显示由编译器生成的代码和专用于异常处理的数据结构占用的已加载内存占用的百分比?
我刚刚学习了Java的Scanner类,现在我想知道它如何与StringTokenizer和String.Split进行比较/竞争.我知道StringTokenizer和String.Split只适用于字符串,那么为什么我要将扫描器用于字符串呢?Scanner只是打算一站式购物吗?
我有一个名为ImageMatrix的类,它以递归方式实现C++映射; 最终结果是我有一个3维数组.
typedef uint32_t VUInt32;
typedef int32_t VInt32;
class ImageMatrix
{
public:
ImageMatrixRow operator[](VInt32 rowIndex)
private:
ImageMatrixRowMap rows;
};
typedef std::map <VUInt32, VInt32> ImageMatrixChannelMap;
class ImageMatrixColumn
{
public:
VInt32 &operator[](VUInt32 channelIndex);
private:
ImageMatrixChannelMap channels;
};
typedef std::map<VUInt32, ImageMatrixColumn> ImageMatrixColumnMap;
class ImageMatrixRow
{
public:
ImageMatrixColumn operator[](VUInt32 columnIndex);
private:
ImageMatrixColumnMap columns;
};
typedef std::map<VUInt32, ImageMatrixRow> ImageMatrixRowMap;
Run Code Online (Sandbox Code Playgroud)
每个运算符只返回一个map-wrapper类,如下所示:
ImageMatrixRow ImageMatrix::operator[](VInt32 rowIndex)
{
return rows[rowIndex];
}
ImageMatrixColumn ImageMatrixRow::operator[](VUInt32 columnIndex)
{
return columns[columnIndex];
}
VInt32 &ImageMatrixColumn::operator[](VUInt32 channelIndex)
{
return channels[channelIndex];
}
Run Code Online (Sandbox Code Playgroud)
基本上,当我将值设置为100,并将值测试为cout时,它显示为0,而不是我设置它的数字.
for (VUInt32 a …Run Code Online (Sandbox Code Playgroud) 我有一台新的笔记本电脑在工作,本周早些时候工作的代码今天不起作用.
以前工作的代码是简化的:
while (dr.Read())
{
int i = int.Parse(dr.GetString(1))
}
Run Code Online (Sandbox Code Playgroud)
现在它在数据库值为0时失败.有时,但不可靠,这将起作用:
while (dr.Read())
{
int i = Convert.ToInt32(dr["FieldName"]))
}
Run Code Online (Sandbox Code Playgroud)
我错过了一些愚蠢的东西吗?
奇怪的是,ReSharper也遇到了大量奇怪的错误,我使用上面的代码得到了相同的错误信息:"输入字符串的格式不正确." (在我加载项目之前开始.)
有任何想法吗?任何有SP问题的人?当我拿到机器时,我确实试图确保所有的SP都是最新的.
编辑:我知道如何使用Try.Parse和错误处理.这里的代码是简化的.我正在从数据库表中读取测试用例.此列仅包含0,1和2值.我已经证实了这一点.我打破了这一点,将数据库字段放入字符串变量s然后尝试int.Parse(s).该代码本周早些时候工作,数据库没有改变.唯一改变的是我的环境.
为了完全简化问题,这行代码抛出异常("输入字符串格式不正确"):
int.Parse("0");
Run Code Online (Sandbox Code Playgroud)
编辑:感谢大家帮我解决这个问题!解决方案是强制重置我的语言设置.
我的WPF应用程序从Microsoft.Win32.OpenFileDialog()获取用户的文件...
Private Sub ButtonUpload_Click(...)
Dim FileOpenStream As Stream = Nothing
Dim FileBox As New Microsoft.Win32.OpenFileDialog()
FileBox.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
FileBox.Filter = "Pictures (*.jpg;*.jpeg;*.gif;*.png)|*.jpg;*.jpeg;*.gif;*.png|" & _
"Documents (*.pdf;*.doc;*.docx;)|*.pdf;*.doc;*.docx;|" & _
"All Files (*.*)|*.*"
FileBox.FilterIndex = 1
FileBox.Multiselect = False
Dim FileSelected As Nullable(Of Boolean) = FileBox.ShowDialog(Me)
If FileSelected IsNot Nothing AndAlso FileSelected.Value = True Then
Try
FileOpenStream = FileBox.OpenFile()
If (FileOpenStream IsNot Nothing) Then
Dim ByteArray As Byte()
Using br As New BinaryReader(FileOpenStream)
ByteArray = br.ReadBytes(FileOpenStream.Length)
End Using
Dim z As New …Run Code Online (Sandbox Code Playgroud) 假设我不知道我的基节点或其子节点的名称,"所有节点恰好在基节点下面的一个节点的XPath语法是什么?"
使用pattern作为XmlNode,我有以下代码:
XmlNodeList kvpsList = pattern.SelectNodes(@"//");
Run Code Online (Sandbox Code Playgroud)
哪个看起来对我来说,但我得到以下例外:
System.Xml.XPath.XPathException: Expression must evaluate to a node-set.
Run Code Online (Sandbox Code Playgroud)
什么是正确的语法?
我有一个TCP客户端,它将数据包放在一个结构中
using System.Runtime.InteropServices;
[StructLayoutAttribute(LayoutKind.Sequential)]
public struct tPacket_5000_E
{
public Int16 size;
public Int16 opcode;
public byte securityCount;
public byte securityCRC;
public byte flag;
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 8, ArraySubType = UnmanagedType.I1)]
public byte[] blowfish;
public UInt32 seedCount;
public UInt32 seedCRC;
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 5, ArraySubType = UnmanagedType.I1)]
public UInt32[] seedsecurity;
}
Run Code Online (Sandbox Code Playgroud)
我用来将数据包放入结构中的代码是:
tPacket_5000_E packet = new tPacket_5000_E();
GCHandle pin = GCHandle.Alloc(data, GCHandleType.Pinned);
packet = (tPacket_5000_E)Marshal.PtrToStructure(pin.AddrOfPinnedObject(), typeof(tPacket_5000_E));
pin.Free();
Run Code Online (Sandbox Code Playgroud)
现在,在我继续之前,我必须告诉你我正在将这个项目从C++转换为C#.
这就是问题:
tPacket_5000_E的最后3个成员是Int32(我也尝试过UInt32),这是C++中的DWORD.这三个成员之前的值(非 Int32)与C++中的值相同.(我在C++和C#项目中都注入相同的数据包).
但是,这三个成员有不同的价值观.
在C++中,值是(正确的):