我正在构建WCF服务。 我需要将参考数据存储在缓存中,每次从该方法接收输入时我都会对其进行查找...正确的方法是什么? 我还想为缓存定义一个过期策略,该策略将在一定时间间隔后使其失效。
有什么方法可以在switch语句中创建条件条件,即您说字符串是否以某些内容开头吗?
前
Switch (mystring)
{
case("abc")://String begins with abc (abcd or abc1 or abcz or abc.. or abc will fall in this condition).
//Do Something
break;
default:
break;
}
更新其他字符串的长度可以不同。
abc ..
abczyv
分解。
qwerty
问
将我的第一个大小合适的Web应用程序上载到共享主机,这给我带来了一系列新的挑战,我的意思是不眠之夜。 问题是我最肯定没有开发我的中等信任度应用程序(或有任何线索)。
我解决了所有问题,保存了一个。
我已经为管理员编写了一个安装程序,以能够指定其连接字符串和其他首选项,但是我找不到以中等信任度写入web.config的方法。 有没有人有解决方案,还是我应该将偏好设置放在另一个文件中?
我的LINQ中有以下代码:
where (tf.Shipped || tf.Ordered || tf.Processed)
请注意,“已发货”,“已订购”和“已处理”都是可空的布尔字段
我收到以下消息:
运算符|| 不能应用于类型为“布尔”的操作数? 和“布尔?”
不确定如何将其解决,因为它们需要为可为null的布尔值,而我需要使用OR(||)。
我正在尝试确定哪种方法删除字符串最快。
我只是获得开始时间和结束时间并显示差异。
但是结果是如此多样,例如 如下所示,相同的方法可能需要60毫秒至231毫秒。
什么是获得更准确结果的更好方法?
替代文字[http://www.deviantsart.com/upload/1q4t3rl.png]
using System;
using System.Collections;
using System.Collections.Generic;
namespace TestRemoveFast
{
class Program
{
static void Main(string[] args)
{
for (int j = 0; j < 10; j++)
{
string newone = "";
List<string> tests = new List<string>();
for (int i = 0; i < 100000; i++)
{
tests.Add("{http://company.com/Services/Types}ModifiedAt");
}
DateTime start = DateTime.Now;
foreach (var test in tests)
{
//newone = ((System.Xml.Linq.XName)"{http://company.com/Services/Types}ModifiedAt").LocalName;
newone = Clean(test);
}
Console.WriteLine(newone);
DateTime end = DateTime.Now;
TimeSpan duration = end - start;
Console.WriteLine(duration.ToString());
}
Console.ReadLine();
}
static string Clean(string line)
{
int pos = line.LastIndexOf('}');
if (pos > 0)
return line.Substring(pos + 1, line.Length - pos - 1);
//return line.Substring(pos + 1);
else
return line;
}
}
}
我正在尝试验证传递的变量是否可以转换为特定类型。 我已经尝试了以下内容,但无法对其进行编译,因此我认为我将以错误的方式进行操作(我是C#的新手)
string myType = "System.Int32";
string myValue = "42";
bool canBeCast = false;
try
{
// try to convert the value to it's intended type to see if it's valid.
var result = (Type.GetType(typeString))dataValue;
canBeCast = true;
}
catch
{
canBeCast = false;
}
我基本上是在尝试避免大规模的switch语句
switch(myType){
case "System.Int32":
try
{
var convertedValue = Convert.ToInt32(myValue);
}
catch (Exception)
{
canBeConverted = false;
}
break;
case "another type":
...
}
编辑:
好的,基本上我有一个已知输入类型的数据库表,如下所示:
CREATE TABLE [dbo].[MetadataTypes] (
[typeName] VARCHAR (50) NOT NULL,
[dataType] VARCHAR (50) NOT NULL,
[typeRegex] VARCHAR (255) NULL
);
其中可能包含诸如
"StartTime","System.DateTime",null
"TicketId","System.String","$[Ff][0-9]{7}^"
输入到我的函数将是一个KeyValuePair类似于
myInput = new KeyValuePair<string,string>("StartTime","31/12/2010 12:00");
我需要检查KeyValuePair的值是否具有MetaDataType期望的正确数据类型。
编辑答案:
Leon非常接近我终于想到的解决方案。
供参考,我的函数现在如下所示:
public Boolean ValidateMetadata(KeyValuePair<string, string> dataItem)
{
// Look for known metadata with name match
MetadataType type = _repository.GetMetadataTypes().SingleOrDefault(t => t.typeName == dataItem.Key);
if (type == null) { return false; }
// Get the data type and try to match to the passed in data item.
Boolean isCorrectType = false;
string typeString = type.dataType;
string dataValue = dataItem.Value;
try
{
var cValue = Convert.ChangeType(dataValue, Type.GetType(typeString));
isCorrectType = true;
}
catch
{
isCorrectType = false;
}
//TODO: Validate against possible regex here....
return isCorrectType;
}
我知道这个问题已经被一遍又一遍地问了,但是我似乎找不到足够好的答案。 因此,为了明确说明我想知道的内容,我将其分为两个问题:
为什么接口不能具有静态方法签名? 我将尝试先回答以下非回答问题:为什么在世界上我想使用以下命令:我希望能够静态调用SqliteCodeGenerator
和MssqlCodeGenerator
上的interface ICodeGenerator
{
// this is the method I would like to be static:
string GetDbConnectionType();
}
abstract class CodeGeneratorBase : ICodeGenerator
{
public abstract string GetDbConnectionType();
public void GenerateSomeCode(StringBuilder s)
{
s.AppendLine("var foo = new " + GetDbConnectionType() + "();");
}
}
class SqliteCodeGenerator : CodeGeneratorBase
{
public override string GetDbConnectionType()
{
return "SQLiteConnection";
}
}
class MssqlCodeGenerator : CodeGeneratorBase
{
public override string GetDbConnectionType()
{
return "SqlConnection";
}
}
:
interface ICodeGenerator
{
// this is the method I would like to be static:
string GetDbConnectionType();
}
abstract class CodeGeneratorBase : ICodeGenerator
{
public abstract string GetDbConnectionType();
public void GenerateSomeCode(StringBuilder s)
{
s.AppendLine("var foo = new " + GetDbConnectionType() + "();");
}
}
class SqliteCodeGenerator : CodeGeneratorBase
{
public override string GetDbConnectionType()
{
return "SQLiteConnection";
}
}
class MssqlCodeGenerator : CodeGeneratorBase
{
public override string GetDbConnectionType()
{
return "SqlConnection";
}
}
另一方面,这是第二个问题,如果您知道达到上述目标的好选择,那么无论如何...
我在TestBase类中添加了这些方法:
[ClassInitialize]
public static void InitializBeforeAllTests()
{
}
但是当我在Debug中运行单元测试Test1()
时:
[TestClass]
public class TestMapping : TestBase
{
[TestMethod]
public void Test1()
{
}
永远不会调用3007582617320555555520方法。为什么?
我有一种方法可以抛出两个不同的异常CommuncationException
和SystemException
。在两种情况下,我都执行相同的三行代码块。
try {
...
}
catch (CommunicationException ce) {
...
}
catch {SystemExcetion se) {
...
}
有可能这样做吗?
try {
...
}
catch (CommunicationException ce, SystemException se) {
...
}
这样,我就不必编写这么多代码。 我知道我可以将异常处理提取到私有方法,但是由于代码只有3行,因此方法定义将比主体本身花费更多的代码。
使用扩展语法,我试图在我拥有的两个列表上使用LINQ创建左联接。 以下是来自Microsoft帮助的信息,但我已对其进行了修改,以表明宠物列表中没有任何元素。 我最后得到的是0个元素的列表。 我认为这是因为发生了内部联接。 我要结束的是3个元素(3 Person对象)的列表,其中为缺少的元素填充了空数据。 即左联接。 这可能吗?
Person magnus = new Person { Name = "Hedlund, Magnus" };
Person terry = new Person { Name = "Adams, Terry" };
Person charlotte = new Person { Name = "Weiss, Charlotte" };
//Pet barley = new Pet { Name = "Barley", Owner = terry };
//Pet boots = new Pet { Name = "Boots", Owner = terry };
//Pet whiskers = new Pet { Name = "Whiskers", Owner = charlotte };
//Pet daisy = new Pet { Name = "Daisy", Owner = magnus };
List<Person> people = new List<Person> { magnus, terry, charlotte };
//List<Pet> pets = new List<Pet> { barley, boots, whiskers, daisy };
List<Pet> pets = new List<Pet>();
// Create a list of Person-Pet pairs where
// each element is an anonymous type that contains a
// Pet's name and the name of the Person that owns the Pet.
var query =
people.Join(pets,
person => person,
pet => pet.Owner,
(person, pet) =>
new { OwnerName = person.Name, Pet = pet.Name }).ToList();
myCol
和-=
运算符到底是做什么的?
还是它们是隐式的,因为它们是按类型定义的?
我已经广泛使用了它们,这是语法的一个非常简单的功能,但是我从未想过它的工作原理。
问题产生了什么
我可以像这样连接一个字符串值:
var myString = "hello ";
myString += "world";
一切都很好。 但是,为什么这不适用于收藏夹呢?
var myCol = new List<string>();
myCol += "hi";
您可能会说:“您正在尝试附加其他类型,不能将字符串附加到非字符串类型中”。 但是以下方法也不起作用:
var myCol = new List<string>();
myCol += new List<string>() { "hi" };
好的,也许它不适用于集合,但是以下内容不是事件处理程序的(某种)集合吗?
myButton.Click += myButton_Click;
我显然对这些操作员的工作方式缺乏深入的了解。
请注意:我不是在实际项目中尝试以此方式构建集合myCol
。 我只是对这个运算符的运作感到好奇,这是假设的。
考虑此类:
public class Content
{
public virtual bool IsCheckedOut {get; private set;}
public virtual void CheckOut()
{
IsCheckedOut = true;
}
public virtual void CheckIn()
{
//Do Nothing for now as demonstrating false positive test.
}
}
Checkin方法有意为空。 现在,我有一些测试方法来验证调用每个方法的状态。
[TestMethod]
public void CheckOutSetsCheckedOutStatusToTrue()
{
Content c = new Content();
c.CheckOut();
Assert.AreEqual(true, c.IsCheckedOut); //Test works as expected
}
[TestMethod]
public void CheckInSetsCheckedOutStatusToFalse()
{
Content c = new Content();
c.CheckIn();
Assert.AreEqual(false, c.IsCheckedOut); //Test does not work as expected
}
由于错误原因,第二次测试通过。 那么,如何使用模拟(moq)来验证CheckIn设置了IsCheckedOut属性?
谢谢。
编辑
需要说明的是:我有一个称为CheckIn()的方法,其作用是将IsCheckedOut状态设置为false。
您将在上面的测试代码中看到,即使我未将属性值设置为false,测试也将返回false。 这是预料之中的,这里没有错。
我认为我的问题特别是如何验证Check In()方法是否已将IsChecked Out属性设置为false? 这就是我所说的行为验证。
我相信某些评论建议做一些等同于状态验证的事情? 如果是这样,我不相信在我们可以简单使用的情况下完全嘲笑这一部分没有任何价值:
Content c = new Content();
c.CheckIn();
Assert.AreEqual(false, c.IsCheckedOut); //State verification
当然我可能是错的,所以请帮助我阐明这些概念:)
Microsoft Windows 10随附有Microsoft Print To PDF打印机,可以将某些内容打印到PDF文件。 它提示下载文件名。
如何通过C#以编程方式控制它,以不提示输入PDF文件名,而是保存到我提供的某些文件夹中的特定文件名?
这是用于以编程方式将大量文档或其他类型的文件打印到PDF的批处理。
{rant}首先,我想说这不是重复的。 我之前曾问过这个问题,但是当不是这个问题时,它就被关闭了。 这个问题是VS 2010的特定问题,是VS 2008中所谓重复工作的答案,而VS 2010中不是(至少对我或我认识的人而言)。 因此,在关闭重复项之前,请仔细阅读问题并自己尝试答案,看看它是否确实有效。 道歉的道歉,但没有明显的方法联系已关闭问题或重新开放的SO警察。 {/ rant}
在工作中,我们有一个包含80多个项目的C#解决方案。 在VS 2008中,一旦解决方案中的项目无法生成,我们就使用宏来停止编译(有关VS 2005和VS 2008的几个选项,请参阅此问题:在第一个编译错误时自动停止Visual C ++ 2008生成吗?)。
在VS 2010中可以做同样的事情吗? 我们发现,在VS 2010中,宏不起作用(至少我无法使它们起作用),因为在VS 2010中似乎没有触发环境事件。
默认行为是尽可能继续并在错误窗口中显示错误列表。 我很高兴它在遇到错误(文件级)或项目无法构建(项目级)时立即停止。
请仅回答VS 2010。 如果这些宏能够正常工作,那么将对如何为VS 2010配置宏进行详细说明。
谢谢。
我想将一个字符串(显然是xml)转换为C#中的XmlNode。在网上搜索时,我得到了这段代码。我想知道这是否是将字符串转换为XmlNode的好方法? 我必须在一个循环中执行此转换,是否会引起性能问题?
XmlTextReader textReader = new XmlTextReader(new StringReader(xmlContent));
XmlDocument myXmlDocument = new XmlDocument();
XmlNode newNode = myXmlDocument.ReadNode(textReader);
请回复,
谢谢
亚历克斯
我在Application_Start上生成了一个线程,并希望记录异常。 没有ErrorSignal.FromCurrentContext().Raise(ex);
,那么如何记录它?
目前,它在我的线程中没有捕获任何异常,并且如果我写ErrorSignal.FromCurrentContext().Raise(ex);
,我将收到有关上下文的错误,不能为null。
也许我可以创建一个虚拟的HttpContext,但是以某种方式我认为它不会很好用。
-edit-我尝试了ErrorSignal.Get(new HttpApplication()).Raise(ex);
,但似乎没有发现该异常。
我使用拖放将数据源对象(一个数据库模型)绑定到CollectionViewSource
(基本上遵循带WPF的实体框架数据绑定中的此示例。
使用此实现,一切正常。
<Window.Resources>
<CollectionViewSource x:Key="categoryViewSource"
d:DesignSource="{d:DesignInstance {x:Type local:Category}, CreateList=True}"/>
</Window.Resources>
<Grid DataContext="{StaticResource categoryViewSource}">
..
private void Window_Loaded(object sender, RoutedEventArgs e)
{
System.Windows.Data.CollectionViewSource categoryViewSource =
((System.Windows.Data.CollectionViewSource)(this.FindResource("categoryViewSource")));
_context.Categories.Load();
categoryViewSource.Source = _context.Categories.Local;
}
public MainWindow()
{
InitializeComponent();
this.DataContext = new MyViewModel();
}
但是,当我尝试在ViewModel中使用相同的代码时,它不起作用(CollectionViewSource
不可用),此外,我认为这不是正确的方法(即在MVVM中使用DataBinding
)。
我真的很感激能为我指出什么是用DataGrid
实现CollectionViewSource
和DataBinding
的正确方法。
我正在研究如何在C#应用程序中实现日志记录-它是DLL类库。 哪些日志记录框架被最广泛地使用-什么会给我的DLL用户最大的灵活性和可配置性? 是否有C#等同于log4j?
只是检查...正在安全访问_count
,对吗?
两种方法都可以通过多个线程访问。
private int _count;
public void CheckForWork() {
if (_count >= MAXIMUM) return;
Interlocked.Increment(ref _count);
Task t = Task.Run(() => Work());
t.ContinueWith(CompletedWorkHandler);
}
public void CompletedWorkHandler(Task completedTask) {
Interlocked.Decrement(ref _count);
// Handle errors, etc...
}
从msdn我得到这个:
#pragma warning disable warning-list
#pragma warning restore warning-list
在示例中,使用了disable
和restore
。 如果要禁用整个文件,是否需要restore
?
就像,如果我不还原,它能走多远? 之后是否为所有编译的内容禁用警告? 还是仅用于该文件的其余部分? 还是被忽略了?