如果我有一个包含标志枚举的变量,我可以以某种方式迭代该特定变量中的位值吗?或者我是否必须使用Enum.GetValues迭代整个枚举并检查哪些枚举?
所以,如果我执行以下代码......
int x = 0;
Debug.WriteLine(x++);
Debug.WriteLine(x += 4);
Debug.WriteLine(x);
Run Code Online (Sandbox Code Playgroud)
......我分别得到0,5和5.我想得到的是0,1和5.在C#中有没有办法用n进行后递增?或者我必须写出+ =作为自己的陈述?
仅仅是为了上下文,我实际上正在做的是缓冲区上的一堆BitConverter操作,并且将每个操作作为一个自给自足的语句非常好,其中偏移量增加了数据类型的大小.转换成.这样,如果稍后更改缓冲区格式,我可以添加或删除一行,而不必担心任何周围的代码.
根据http://msdn.microsoft.com/en-US/library/0fss9skc(v=vs.120).aspx,属性不应返回数组.这如何与泛型相互作用?如果数组是允许的类型为一个通用的,我应该做的功能,如T GetValue()和SetValue(T value),而不是T Value { get; set; }?
我有一组类,每个类都需要在某个时候决定他们应该在内部使用哪两种或三种方法在外部实现相同的功能.理想情况下,这应该包括回退功能,如果ApproachA失败,它会通过尝试ApproachB(并且可能接近C,D等).到目前为止,我一直在使用类似的编码if (!success) { ApproachB code }.这样做的问题是,后面的几个方法也需要知道选择了哪种方法,并且所有这些方法都要开发自己的if (MethodChosen) { } else { }语句.我真的想用一些不那么笨拙的东西来解决这个问题......除了我认为的其他选择似乎都不那么"狡猾".以下是我想到的三种方法:
使用可在运行时更改的子类实现通常构造的抽象类:即
public void SomeMethodOrConstructor()
{
if (someConditions)
MyChild = ChildClassA;
else
MyChild = ChildClassB;
}
public void Execute()
{
MyChild.Execute();
}
Run Code Online (Sandbox Code Playgroud)选项3的问题是在需要时在两者之间传递数据.由于这些方法中的一些是在对象之外进行建模,因此这将是相当频繁的.嵌套类是否自动与父类共享数据?或者我是否必须在每次通话时都通过?
还有什么我应该考虑的吗?
更新:第一堂课正在运行责任链.目前,我选择在方法执行期间不使用策略模式或回退,因为我认为最终可能没有必要.我认为大多数这样的执行后备实际上会更好地保留在他们自己的课程中,因为不会完全改变游戏规划,只需要进行一些小的调整即可.如果结果不是这样,我至少知道我现在需要调查的是什么.
感谢所有帮助最终解决方案的人!
对于好奇,我的终极解决方案大致如下:
public abstract Handler GetHandler()函数,并添加其他抽象方法,如Load,Save等.FirstHandler.GetHandler(this)并存储结果,以便类知道将来使用哪个处理程序.Handler.MethodName().到目前为止,我一直在使用KeyedCollection创建大型对象集合(接近一百万),每个对象都有一个uint ID字段作为集合的键。太好了,但是现在在扩展功能时遇到了一个问题:我具有“覆盖”记录,需要用新项替换具有相同键的任何现有项。平均而言,可能会覆盖20条记录中的1条,对于同一条记录,甚至可以多次重写。
我不介意在必要时从KeyedCollection进行重构。我最好的选择是什么?字典<>?这些ID不是顺序的,因此可以直接索引。
这里有点新手问题.
在VC#2010 Express中,是否有一种简单的方法来准备要发布的源代码?换句话说,删除任何不应发布的文件,如密钥文件,用户特定设置等.
如果没有,有人能指出我的清单或那种性质的东西吗?
这是我正在使用的XML示例(可从任何wiki的Special:Export/SomePage结果中检索):
<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.4/ http://www.mediawiki.org/xml/export-0.4.xsd" version="0.4" xml:lang="en">
<siteinfo>
<sitename>Wikipedia</sitename>
<base>http://en.wikipedia.org/wiki/Main_Page</base>
<generator>MediaWiki 1.16wmf4</generator>
<case>first-letter</case>
<namespaces>
<namespace key="-2" case="first-letter">Media</namespace>
<namespace key="-1" case="first-letter">Special</namespace>
<namespace key="0" case="first-letter" />
...
</namespaces>
</siteinfo>
</mediawiki>
Run Code Online (Sandbox Code Playgroud)
我已经尝试了所有我能想到的东西,直接"跳转"到siteinfo节点并迭代结果,除非我从根目录手动浏览每个子节点,否则没有任何作用.我已经尝试了各种各样的.Move*和.Select*方法的百万种变化,看起来我只是把头靠在墙上,但我现在的变体看起来像这样:
StringReader strr = new StringReader(_rawData);
XPathDocument xd = new XPathDocument(XmlReader.Create(strr, Bot.XmlReaderSettings));
XPathNavigator xn = xd.CreateNavigator();
XPathNodeIterator xni = xn.Select("/mediawiki/siteinfo");
foreach (XPathNavigator nav in xni)
Console.WriteLine(nav.LocalName);
Run Code Online (Sandbox Code Playgroud)
这不会返回任何结果.我究竟做错了什么?
有没有一种简单的方法来检测XPathNavigator XML节点上是否存在空属性(例如<node>vs. <node attribute="">)?Node.GetAttribute无论如何返回一个空字符串.我唯一能想到的就是检查Node.OuterXML房产,这看起来真的很愚蠢.
(注意:节点实际上不是空的,所以我不能只使用Node.HasAttributes.)
是否可以将枚举键字典转换为整数字典?(或者复制构造函数也适用于我正在做的事情.)换句话说,看起来像:
Dictionary<int, string> NewDictionary =
(Dictionary<int, string>)OldDictionary<MyEnum, string>;
Run Code Online (Sandbox Code Playgroud)
(是的,我知道语法不太正确,只是为了表明我来自哪里.)
当然,编写起来很容易,但是在C#2010中,是否有内置的Join(或类似)方法,如果前一个和下一个元素都是非空且非空,那么它只会添加一个分隔符?
换句话说,SmartJoin(", ","Hood","Robin")会产生"胡德,罗宾",但SmartJoin(", ", "Robin Hood", string.Empty)会产生简单的"罗宾汉".
c# ×9
.net ×2
generics ×2
xpath ×2
collections ×1
dictionary ×1
enum-flags ×1
enums ×1
join ×1
modeling ×1
release ×1
string ×1
xml ×1