在集合上使用Linq,以下代码行之间有什么区别?
if(!coll.Any(i => i.Value))
Run Code Online (Sandbox Code Playgroud)
和
if(!coll.Exists(i => i.Value))
Run Code Online (Sandbox Code Playgroud)
更新1
当我反汇编.Exists
它看起来没有代码.
更新2
任何人都知道为什么这个没有代码?
我正在创建一个抽象类.我希望每个派生类都被强制实现构造函数的特定签名.因此,我做了我想做的事情,我想强制他们实现一个方法,我做了一个抽象的方法.
public abstract class A
{
abstract A(int a, int b);
}
Run Code Online (Sandbox Code Playgroud)
但是我收到一条消息,说明这个项目的抽象修饰符无效.我的目标是强制这样的代码.
public class B : A
{
public B(int a, int b) : base(a, b)
{
//Some other awesome code.
}
}
Run Code Online (Sandbox Code Playgroud)
这是所有C#.NET代码.谁能帮我吗?
更新1
我想补充一些东西.我最终得到的是这个.
private A() { }
protected A(int a, int b)
{
//Code
}
Run Code Online (Sandbox Code Playgroud)
这就是一些人所说的,默认是私有的,并且类需要实现构造函数.但是,这不会强制带有签名A(int a,int b)的构造函数.
public abstract class A
{
protected abstract A(int a, int b)
{
}
}
Run Code Online (Sandbox Code Playgroud)
更新2
我应该清楚,为了解决这个问题,我将默认构造函数设为私有,并保护我的其他构造函数.我并不是在寻找一种让我的代码工作的方法.我照顾好了.我想了解为什么C#不允许你这样做.
我有一些代码,我在C#中使用线程静态对象.
[ThreadStatic]
private DataContext connection
Run Code Online (Sandbox Code Playgroud)
我想知道,在这种情况下,如果我将静态修饰符放在线程静态上下文中,我会得到什么改变?
[ThreadStatic]
private static DataContext connection
Run Code Online (Sandbox Code Playgroud)
第一个是每个线程每个实例有一个上下文副本,每个线程只有一个副本吗?
在C#中,我可以使用以下语法初始化列表.
List<int> intList= new List<int>() { 1, 2, 3 };
Run Code Online (Sandbox Code Playgroud)
我想知道该{}
语法是如何工作的,如果它有一个名称.有一个构造函数IEnumerable
,你可以调用它.
List<int> intList= new List<int>(new int[]{ 1, 2, 3 });
Run Code Online (Sandbox Code Playgroud)
这似乎更"标准".当我解构List的默认构造函数时,我只看到了
this._items = Array.Empty;
Run Code Online (Sandbox Code Playgroud)
我希望能够做到这一点.
CustomClass abc = new CustomClass() {1, 2, 3};
Run Code Online (Sandbox Code Playgroud)
并能够使用该1, 2, 3
列表.这是如何运作的?
更新
Jon Skeet回答道
它调用无参数构造函数,然后调用Add:
> List<int> tmp = new List<int>();
> tmp.Add(1); tmp.Add(2); tmp.Add(3);
> List<int> intList = tmp;
Run Code Online (Sandbox Code Playgroud)
我明白这是做什么的.我想知道怎么做.该语法如何知道调用Add方法?
更新
我知道,接受Jon Skeet的回答是多么陈词滥调.但是,字符串和整数的例子很棒.另外一个非常有用的MSDN页面是:
我想写一个日历应用程序.对于数据库架构来说,这是一个经常出现的问题.我想知道如何组织这个的一些意见.
如果用户创建了一个事件,并且输入它会在周一重复所有人,那会怎么样?我怎么能将所有这些存储在数据库中?我不能创造无限的事件.我只是在那里放一张包含相关信息的表格,以便我可以计算所有事件的去向吗?如果是这样,每次用户查看日历的新部分时,我都必须计算它们.如果他们翻了几个月,但他们有大量的经常性项目怎么办?
此外,架构需要处理用户单击某个项目并在序列中显示"在序列中编辑此项目"而不是序列中的所有项目.然后我将一个项目从序列中分离出来吗?
更新1
我根本没看过iCal.为了清楚起见,我认为保存允许您计算重复项目的信息,并将任何与序列不同的信息拆分是一种很好的方式来存储它以便能够传输它.但我认为在一个应用程序中,这将太慢,无法在所有地方进行日期数学运算.
可能重复:
你能解释一下STA和MTA吗?
所有ThreadPool线程都在多线程单元中.
- 根据MSDN
那是什么意思?我真的很关心多线程和单线程公寓模型之间的区别.或者公寓模型是什么意思?我已经阅读了它的MSDN,这对我来说并没有多大意义.我想我可能有一个想法,但我认为这里有人可以用简单的英语解释它.
谢谢,安东尼D.
更新1
发现这 可以解释STA和MTA吗?
任何人都可以更具描述性吗?
更新2
我也在寻找一个关于如何应用于线程池的答案,以及因此而需要注意的事项.
我希望有一个C#应用程序实现Konami代码来显示复活节彩蛋. http://en.wikipedia.org/wiki/Konami_Code
做这个的最好方式是什么?
这是一个标准的C#windows窗体应用程序.
我有这个代码......
internal static void Start()
{
TcpListener listenerSocket = new TcpListener(IPAddress.Any, 32599);
listenerSocket.Start();
listenerSocket.BeginAcceptTcpClient(new AsyncCallback(AcceptClient), null);
}
Run Code Online (Sandbox Code Playgroud)
然后我的回调函数看起来像这样......
private static void AcceptClient(IAsyncResult asyncResult)
{
MessageHandler handler = new MessageHandler(listenerSocket.EndAcceptTcpClient(asyncResult));
ThreadPool.QueueUserWorkItem((object state) => handler.Process());
listenerSocket.BeginAcceptTcpClient(new AsyncCallback(AcceptClient), null);
}
Run Code Online (Sandbox Code Playgroud)
现在,我调用BeginAcceptTcpClient,然后一段时间后我想停止服务器.为此,我一直在调用TcpListener.Stop()或TcpListener.Server.Close().然而,这两个都执行我的AcceptClient函数.这会在我调用EndAcceptTcpClient时抛出异常.围绕这个的最佳做法是什么?一旦我调用了stop,我就可以放入一个标志来停止执行AcceptClient,但我想知道我是否遗漏了一些东西.
更新1
目前我通过将代码更改为这样来修补它.
private static void AcceptClient(IAsyncResult asyncResult)
{
if (!shutdown)
{
MessageHandler handler = new MessageHandler(listenerSocket.EndAcceptTcpClient(asyncResult));
ThreadPool.QueueUserWorkItem((object state) => handler.Process());
listenerSocket.BeginAcceptTcpClient(new AsyncCallback(AcceptClient), null);
}
}
private static bool shutdown = false;
internal static void Stop()
{
shutdown = true;
listenerSocket.Stop();
}
Run Code Online (Sandbox Code Playgroud)
更新2 …
我正在写这段代码.这里dt输入到函数中,以及someint.Exp列是一个T-SQL日期列,它通过Linq作为DateTime.
return (from a in dataContext.TableOfA
where a.name == "Test" &&
a.Exp.Value.AddDays(Convert.ToDouble(Someint)) >= new DateTimeOffset(dt)
select a).First();
Run Code Online (Sandbox Code Playgroud)
在C#中,您可以在日期时间中添加一天.意思是你可以添加1.5天.在T-SQL中,您只能添加1天,然后增加12小时.您必须为每个部件添加一个int.因此,当Linq将AddDays转换为T-SQL时,它会将我的天数转换为毫秒,并添加这些天数.这允许它给出double赋予C#的所有精度.
这就是问题.当这到达SQL时,我收到错误:
数据类型日期的日期函数dateadd不支持datepart毫秒
基本上你不能在一个日期添加毫秒.好吧不开玩笑.但是我如何获得翻译的内容呢?我想将int天添加到日期.唯一想要这样做的是将它们的负面效果添加到我正在比较的另一个人身上吗?如果我想在添加到列时与列进行比较,该怎么办?
更新1
Keith写道,至少从SQL Server 2000开始,T-SQL支持像datepart(毫秒,10000,myDate)这样的命令.这个错误表明你使用的数据库不支持毫秒日期部分,这对我来说似乎很奇怪.
请注意我使用的是SQL Server 2008.DATE数据类型不支持它.它在datetime上受支持.
我有一个SQL 2008 DB.我正在运行一个支持该数据库的表单,然后尝试更新它.如果更新失败,则想法是恢复该备份.这是我用来恢复备份的代码.
public void RestoreDatabase(String databaseName, String backUpFile, String serverName, String userName, String password)
{
Restore sqlRestore = new Restore();
BackupDeviceItem deviceItem = new BackupDeviceItem(backUpFile, DeviceType.File);
sqlRestore.Devices.Add(deviceItem);
sqlRestore.Database = databaseName;
ServerConnection connection = new ServerConnection(serverName, userName, password);
Server sqlServer = new Server(connection);
sqlRestore.Action = RestoreActionType.Database;
string logFile = System.IO.Path.GetDirectoryName(backUpFile);
logFile = System.IO.Path.Combine(logFile, databaseName + "_Log.ldf");
string dataFile = System.IO.Path.GetDirectoryName(backUpFile);
dataFile = System.IO.Path.Combine(dataFile, databaseName + ".mdf");
Database db = sqlServer.Databases[databaseName];
RelocateFile rf = new RelocateFile(databaseName, dataFile);
sqlRestore.RelocateFiles.Add(new RelocateFile(databaseName, dataFile));
sqlRestore.RelocateFiles.Add(new …
Run Code Online (Sandbox Code Playgroud) c# ×9
.net ×4
constructor ×2
apartments ×1
backup ×1
calendar ×1
collections ×1
database ×1
datetime ×1
generics ×1
inheritance ×1
linq ×1
linq-to-sql ×1
oop ×1
schema ×1
smo ×1
sockets ×1
sql-server ×1
static ×1
tcpclient ×1
winforms ×1