Home Php C# Sql C C++ Javascript Python Java Go Android Git Linux Asp.net Django .net Node.js Ios Xcode Cocoa Iphone Mysql Tomcat Mongodb Bash Objective-c Scala Visual-studio Apache Elasticsearch Jar Eclipse Jquery Ruby-on-rails Ruby Rubygems Android-studio Spring Lua Sqlite Emacs Ubuntu Perl Docker Swift Amazon-web-services Svn Html Ajax Xml Java-ee Maven Intellij-idea Rvm Macos Unix Css Ipad Postgresql Css3 Json Windows-server Vue.js Typescript Oracle Hibernate Internet-explorer Github Tensorflow Laravel Symfony Redis Html5 Google-app-engine Nginx Firefox Sqlalchemy Lucene Erlang Flask Vim Solr Webview Facebook Zend-framework Virtualenv Nosql Ide Twitter Safari Flutter Bundle Phonegap Centos Sphinx Actionscript Tornado Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 7

10
votes
answers
104 views
+10

如果为空则不要添加到列表c#[保留]

我正在尝试从匿名函数创建一个列表。如果请求模型属性不为null,我希望创建列表。目前,它正在向列表添加null

代码

  public void方法(RequestModel请求){var create = new DtoModel {docs = new List< docsModel> {request.FirstDoc!= null?runFunction(request.FirstDoc):null,request.SecondDoc!= null?runFunction(request.SecondDoc):null,request.ThirdDoc!= null?runFunction(request.ThirdDoc):null,}}; }   

目前,即使任何文档为null,它也会创建一个计数列表3。我将列出仅在docs不为null且列表应仅包含非null的文档时才创建。不应该有任何空值。请求模型可以包含x个文档。

我知道我之后可以使用Linq删除空值,但我正在寻找一个解决方案,它不会在列表中创建空元素。

沙发
+100

基本上你不能用集合初始化器 - 集合初始化器总是添加与逗号分隔列表中的条目相同数量的元素。(我想你可以有一个 Add 方法忽略空值的集合,但 Add 肯定会被调用相同的次数。)

,只需使用 if 语句:

  if(request.FirstDoc!= null){create.docs.Add(runFunction(request.FirstDoc)); } // etc   

您总是可以使用本地方法来简化:

  public void method(RequestModel request){var create = new DtoModel { docs = new List< docsModel>()}; MaybeAdd(request.FirstDoc); MaybeAdd(request.SecondDoc); MaybeAdd(request.ThirdDoc); void MaybeAdd(docsModel doc){if(doc!= null){create.docs.Add(runFunction(doc)); }}   

如果一切都为null,我最初错过了关于列表本身未被初始化的部分。为此,您需要更改它以在每次添加时检查初始化:

  public void method(RequestModel request){var create = new DtoModel() ; MaybeAdd(request.FirstDoc); MaybeAdd(request.SecondDoc); MaybeAdd(request.ThirdDoc); void MaybeAdd(docsModel doc){if(doc!= null){if(create。)docs == null){create.docs = new List< docsModel>(); } create.docs.Add(runFunction(doc));   

顺便说一句,我强烈建议您开始遵循正常的.NET命名约定,使用PascalCase来处理类型和属性( DocsModel Method RunFunction Docs )。

另外,我想(谦卑地)向OP推荐他/她检查三元运算符的工作原理docs.microsoft.com/en-us/dotnet/csharp/language-reference/ - burkay 8月30日22:46

@burkay:我没有看到他们不知道条件运算符的作用。我不认为这是令他们困惑的部分。 - Jon Skeet 8月31日5:50

板凳
-10

使用Linq

您可以使用一点LINQ完成您想要的任务。

  var create = new DtoModel {docs =(new [] {request.FirstDoc,request.SecondDoc,request.ThirdDoc})。Where(d => d!= null)。选择(d => runFunction(d))。ToList()};   

更长但更容易阅读

这有点难以阅读,所以我建议将其分解一下。

创建一个辅助方法将请求展开到数组中:

  static public T [] CreateArray< T>(params T [] input){return input; }   

然后以这种方式编写:

  var requests = CreateArray(request.FirstDoc,request.SecondDoc,request.ThirdDoc); var processedRequests = requests.Where(r => r!= null).Select(r => runFunction(r)); var create = new DtoModel {docs = processedRequests.ToList()};   

或者如果你喜欢使用三元运算符,就像在你的例子中一样,你可以这样做:

  public void method(RequestModel request){ var create = new DtoModel {docs = CreateArray(request.FirstDoc!= null?runFunction(request.FirstDoc):null,request.SecondDoc!= null?runFunction(request.SecondDoc):null,request.ThirdDoc!= null?runFunction (request.ThirdDoc):null,}。Where(d => d!= null).ToList()};
     
			
        

OP表示不使用linq。我同意他的看法。要构造一个包含空值的列表,然后构造另一个带有空值的过滤器,那么从一开始就以正确的方式构造它就没有意义了。 - 丹尼尔施密德8月31日7:28

仔细读。我相信他不想使用linq“之后删除空值”,即希望魔法在集合初始化器中发生。我认为我的代码确实如此。 - John Wu 8月31日7:30

在上一个示例中,您创建一个数组,然后过滤空值(Where(...)),然后从中创建一个List。这就是代码的作用 - Daniel Schmid 8月31日7:39

什么清单?我没有看到任何清单。我看到一个IEnumerable。列表创建一次,使用ToList(),具有正确数量的元素......全部在集合初始值设定项中。 - John Wu 8月31日7:40

10
votes
answers
24 views
+10

为什么LINQ中的LastOrDefault(谓词)比FirstOrDefault(谓词)更快

简介

在测试当前某些LinQ函数的性能差异时,我注意到, LastOrDefault(谓词)几乎总是比 FirstOrDefault(谓词),这让我有点兴趣,所以我写了一些测试用例,以测试彼此的两个函数。

我创建了一个从1到1的 integer 值列表像这样的:

  List< int> l = new List< int>(); for(int i = 1; i< = 1000000; i ++){l.Add(i); }   

然后写了2个方法 first() last()

  static void first(List< int> l){int e = l。FirstOrDefault(x => x == 500000); int z = l.FirstOrDefault(x => x == 500000); int d = l.FirstOrDefault(x => x == 500000); int v = l.FirstOrDefault(x => x == 500000); int f = l.FirstOrDefault(x => x == 500000); }   

我在for循环中运行1000次,在最后一次迭代后设置一个条件停止的断点,但是在我测试的每个单例中, LastOrDefault 更快。

测试用例
  • 两者都设置为列表中间的元素( LastOrDefault 几乎快两倍)
  • 两者都设置为列表中具有相同距离的元素(如250k和750k) - 再次 LastOrDefault 更快
  • Console.WriteLine(DateTime.Now +“:”+ DateTime.Now.Millisecond); for(int i = 0; i< 1000; i ++){first(l); Console.WriteLine(DateTime.Now +“:”+ DateTime.Now.Millisecond); for(int i = 0; i< 1000; i ++){last(l); Console.WriteLine(DateTime.Now +“:”+ DateTime.Now.Millisecond);

    FirstOrDefault 也返回34秒, LastOrDefault

    问题

    为什么 LastOrDefault <

up vote 10 down vote accepted favorite
沙发
+100
+50

steve16351 在已删除的评论中指出,在.NET Core中, Last 具有以下优化:

  if(source is IList&lt; TSource&gt; list){for(int i = list.Count  -  1; i&gt; = 0; --i){TSource result = list [i ]。if(谓词(结果)){found = true; 返回结果; }   

第一个 没有并且最终运行:

  foreach(源代码中的TSource元素){if(predicate(element)){found = true; 返回元素;   

索引器对列表元素的访问很可能比使用 foreach 和迭代器更快。相比之下,.NET Standard没有对 最后 ,而不是遍历完整的输入,而 Last 的运行速度比 First 的运行速度慢。 没有并最终运行:

  foreach(源代码中的TSource元素){if(predicate(element)){found = true; 返回元素;   

索引器对列表元素的访问很可能比使用 foreach 和迭代器更快。相比之下,.NET Standard没有对 最后 ,而不是遍历完整的输入,而 Last 的运行速度比 First 的运行速度慢。 没有并最终运行:

  foreach(源代码中的TSource元素){if(predicate(element)){found = true; 返回元素;   

索引器对列表元素的访问很可能比使用 foreach 和迭代器更快。相比之下,.NET Standard没有对 最后 ,而不是遍历完整的输入,而 Last 的运行速度比 First 的运行速度慢。 foreach(源代码中的TSource元素){if(predicate(element)){found = true; 返回元素;

索引器对列表元素的访问很可能比使用 foreach 和迭代器更快。相比之下,.NET Standard没有对 最后 ,而不是遍历完整的输入,而 Last 的运行速度比 First 的运行速度慢。 foreach(源代码中的TSource元素){if(predicate(element)){found = true; 返回元素;

索引器对列表元素的访问很可能比使用 foreach 和迭代器更快。相比之下,.NET Standard没有对 最后 ,而不是遍历完整的输入,而 Last 的运行速度比 First 的运行速度慢。 索引器对列表元素的访问很可能比使用 foreach 和迭代器更快。相比之下,.NET Standard没有对 最后 ,而不是遍历完整的输入,而 Last 的运行速度比 First 的运行速度慢。 索引器对列表元素的访问很可能比使用 foreach 和迭代器更快。相比之下,.NET Standard没有对 最后 ,而不是遍历完整的输入,而 Last 的运行速度比 First 的运行速度慢。

0

我尝试执行 ExecuteFirst ExecuteLast ,甚至改变执行顺序, LastOrDefault 总是超过 FirstOrDefault

  class Program {static void Main(string [] args){List&lt; int&gt; numbers = new List&lt; int&gt;(); for(int i = 1; i&lt; = 1000000; i ++){numbers.Add(i); } for(int i = 1; i&lt; = 100; i ++){秒表秒表=新秒表(); ExecuteFirst(ref秒表,参考编号); stopwatch.Reset(); ExecuteLast(ref秒表,参考编号); } for(int i = 1; i&lt; = 100; i ++){秒表秒表=新秒表(); ExecuteLast(ref秒表,参考编号); stopwatch.Reset(); ExecuteFirst(ref秒表,参考编号); private static void ExecuteFirst(ref秒表秒表,ref List&lt; int&gt;数字){stopwatch.Start(); int first = numbers.FirstOrDefault(x =&gt; x == 500000); stopwatch.Stop(); Console.WriteLine(“First:”+ stopwatch.Elapsed); } private static void ExecuteLast(ref秒表秒表,ref List&lt; int&gt;数字){stopwatch.Start(); int last = numbers.LastOrDefault(x =&gt; x == 500000); stopwatch.Stop(); Console.WriteLine(“Last:”+ stopwatch.Elapsed); }   

13
votes
answers
30 views
+10

.Net Framework dll无法处理.Net标准项目

我已将 .Net framework ddl引用到 .Net standard 2.0 它将向我显示以下错误。

  System.Reflection.ReflectionTypeLoadException:'无法加载一个或多个请求的类型。给定的程序集名称或代码库'?inDebug etcoreapp2.1FirstDataBank.DrugServer.API.dll'无效。给定的程序集名称或代码库'?inDebug etcoreapp2.1FirstDataBank.DrugServer.API.dll'无效。给定的程序集名称或代码库'?inDebug etcoreapp2.1FirstDataBank.DrugServer.API.dll'无效。给定的程序集名称或代码库'?inDebug etcoreapp2.1FirstDataBank.DrugServer.API.dll'无效。  

相同的ddl工作正常。

沙发
+60
+50

“.Net Framework dll无法处理.Net标准项目” - 嗯,是的; 这是正常的和预期的; 如果您需要使用仅适用于.NET Framework (而不是.NET Standard)的内容,那么:您应该只从一个本身就是.NET Framework的项目中使用它; 或者:考虑重新定位或多目标定位您正在使用的库(如果您控制它;否则:询问供应商),理想情况下,它可以作为针对.NET Standard或多目标的nupkg使用.NET Framework .NET标准。

+70

这根本不受支持。

您可以从.NET Framework项目中引用一些(但不是全部).NET标准库,但不支持其他方式。 < p> .NET Standard旨在支持不同平台之间的代码共享,但.NET Framework仅支持Windows。

为了帮助您开始讨论该主题,这里有一个很好的帖子,它解释得非常简短:< a href =“https://social.msdn.microsoft.com/Forums/vstudio/en-US/7035edc6-97fc-49ee-8eee-2fa4d040a63b/what-are-differences-between-net-framwork-net-standard- and-net-core?forum = clr“rel =”nofollow noreferrer“>标准,框架和核心之间的差异

@MarcGravell thx澄清,我会调整答案 - Michael Sander 8月28日9:31

5
votes
answers
34 views
+10

从实现类调用C#接口默认方法

C#8支持接口中的默认方法实现。我的想法是将一个日志记录方法注入到这样的类中:

  public interface ILoggable {void Log(string message)=&gt; DoSomethingWith(消息); public class MyClass:ILoggable {void MyMethod(){Log(“Using inject logging”); // COMPILER ERROR}}   

我遇到编译器错误:“当前上下文中不存在该名称”

是否无法使用默认方法实现这样?

编辑:

有关C#规则的正确回复,请参阅已接受答复

沙发
+20

在CLR中,所有接口成员实现都是显式的,因此在您的代码中 Log 仅在 ILoggable 的实例中可用,就像它建议做这里

 ((ILoggable)this) .Log(“使用注入记录”) 
     
			
        
板凳
+10

通过阅读有关这些默认方法的文章,我认为您应该尝试将其上传到界面:

 ((ILoggable)this)。。Log(“使用注入日志记录”)  

我没有检查过,只是根据这篇文章

地板
+10

接受的答案和其他答案都是正确的。但是,我想要的是对 Log 方法的简洁调用。我通过 ILoggable 接口上的扩展方法实现了这一点:

  public static class ILoggableUtils {//对于ILoggable public static void Log上的扩展方法(这个ILoggable实例, string message){DoSomethingWith(message,instance.SomePropertyOfILoggable); 以这种方式,我至少可以在我的类中调用 this.Log(...); 而不是丑陋的(( ILoggable)此).LOG(...) 
     
			
        
4楼
+10

如果你想避免混乱和重复的转换,你可以添加一个属性,将类型转换为接口:

  public class MyClass:ILoggable {ILoggable AsILoggable =&gt; (ILoggable)此; void MyMethod(){AsILoggable.Log(“Using inject logging”); }   

但这是 off 无论如何完成,这似乎都是错误的。从文档:

最常见的情况是安全地将成员添加到已经被无数客户发布和使用的接口。

当有一些问题时关于在接口中实现 - 以前没有接口 - 这是理解它的句子。它' 一种添加到接口而不破坏已经实现它的类的方法。

这个问题暗示我们正在修改类以对新方法有“意识”。换句话说,隐含的约束是,无论出于何种原因,修改类以考虑新的接口方法是不切实际的。修改类依赖于新方法表明完全相反。

如果我们已经在修改类,为什么不直接实现该方法呢?

  public void Log(string message)=&gt; DoSomethingWith(消息);   

当我们添加一个默认的接口实现时,我们为接口的使用者提供了一个实现 - 依赖于抽象的类。 < p>如果我们依赖于实现接口的类中的的默认接口实现,那么对接口的更改实际上变为对类的内部实现的更改。这不是界面的用途。接口表示面向外部的行为,而不是内部实现。

就好像该类在自身之外,回顾自身作为外部消费者,并将其作为其内部实现的一部分。该类没有实现接口,但它依赖于它。这很奇怪。

我不会说这是错的,但感觉就像滥用这个功能一样。 / em>实现接口的类,然后对接口的更改实际上变为对类的内部实现的更改。这不是界面的用途。接口表示面向外部的行为,而不是内部实现。

就好像该类在自身之外,回顾自身作为外部消费者,并将其作为其内部实现的一部分。该类没有实现接口,但它依赖于它。这很奇怪。

我不会说这是错的,但感觉就像滥用这个功能一样。 / em>实现接口的类,然后对接口的更改实际上变为对类的内部实现的更改。这不是界面的用途。接口表示面向外部的行为,而不是内部实现。

就好像该类在自身之外,回顾自身作为外部消费者,并将其作为其内部实现的一部分。该类没有实现接口,但它依赖于它。这很奇怪。

我不会说这是错的,但感觉就像滥用这个功能一样。 不是界面的用途。接口表示面向外部的行为,而不是内部实现。

就好像该类在自身之外,回顾自身作为外部消费者,并将其作为其内部实现的一部分。该类没有实现接口,但它依赖于它。这很奇怪。

我不会说这是错的,但感觉就像滥用这个功能一样。 不是界面的用途。接口表示面向外部的行为,而不是内部实现。

就好像该类在自身之外,回顾自身作为外部消费者,并将其作为其内部实现的一部分。该类没有实现接口,但它依赖于它。这很奇怪。

我不会说这是错的,但感觉就像滥用这个功能一样。 实现接口,但它取决于它。这很奇怪。

我不会说这是错的,但感觉就像滥用这个功能一样。 实现接口,但它取决于它。这很奇怪。

我不会说这是错的,但感觉就像滥用这个功能一样。

这不是滥用,它是一个核心用例 - 特征。OP的代码来自Mads Torgersen的博客文章。该日志代码不是内部实现,它是为类提供的特性。代码实际上是类的外部,除了通过接口方法之外无法与它通信 - 这就是抽象方法的原因 - Panagiotis Kanavos 16小时前

在过去,人们试图通过代码来添加例如日志记录或撤消,例如MyClass:Loggable 或MyClass:Undoable ,组合/委托,或者通过使用反射。毋庸置疑,第一次尝试滥用继承,委托,增加了很多复杂性和反思太慢。 - Panagiotis Kanavos 16小时前

微软表示:“默认界面成员还支持类似”特征“语言功能的方案。” - 我觉得这不像是虐待!只是在类中实现Log方法对我来说是没有选择的。除了在这个简单的例子中,ILogging接口包含许多我想在许多类中使用的方法。 - Andi 13小时前

@PanagiotisKanavos - 这就是为什么我限定一切并尽量避免绝对陈述。我要为这个挣扎。所以我可以理解这个问题 - 你是说一个核心用例是一个类在内部将自己强制转换为它实现的接口,以便它可以调用一个它没有实现它部分实现的接口的方法吗?我很难过,但我可以克服它。 - Scott Hannen 13小时前

17
votes
answers
16 views
+10

为什么字符串添加结果如此奇怪?

  public static void Main(string [] args){int num = 1; string number = num.ToString(); Console.WriteLine(数[0]); Console.WriteLine(number [0] + number [0]); }   

我希望 1 11 的输出,但我得到 1 98 我错过了什么?

沙发
+90
+50

number [0] 的类型是 char ,而不是 string - 你没有执行任何字符串连接。相反,你有一个值为49的 char ('1'的UTF-16值)。没有 +(char,char)运算符,因此两个操作数都被提升为 int ,并且你正在执行整数加法。

所以这一行:

  Console.WriteLine(number [0] + number [0]);   

实际上是这样的:

  char op1 = number [0]; int promote1 = op1; char op2 = number [0]; int promote2 = op2; int sum = promote1 + promote2; Console.WriteLine(总和);   

(它'

+80

由于[],这会给出字符串的第一个字符。

number [0] + number [0] 正在执行49 + 49(ascii代码char 1);

我想你想这样做:

  public static void Main(string [] args){int num = 1; string number = num.ToString(); Console.WriteLine(数); Console.WriteLine(数字+数字); }  
     
			
        

有关更多信息,请参阅此处:stackoverflow.com/questions/16851809/char-char-int-why - Alexander Ushakov 8月28日18:44

感谢Dan的解释,感谢Alexander提供有关该主题的更多内容。 - k0fe 8月28日18:48

7
votes
answers
26 views
+10

Blob Code下载比MS Azure Storage Explorer慢得多

我正在从1GB大小的blob存储中下载一个blob。

如果我使用MS Azure存储资源管理器,它需要不到10分钟(我有一个20兆位的下行)。

但是当我使用代码时:

  await blobRef.DownloadToFileAsync(“D: temp  data.mdf”,FileMode.Create);   

(我也尝试使用内存流)下载250MB需要一个多小时(此时我将其杀死)。我已多次完成此测试,并且始终如一。

我还监控网络流量。

  • 通过Storage Exlorer网络流量下降约20Megabits
  • 通过代码,网络流量向下约为1兆位

    编辑:我仍在使用旧版本的Azure Storage Explorer(1.4.1)。但我可以确认新版本也会给出相同的结果。

沙发
+40

我最终尝试了@Ivan和@mwwills提出的2个解决方案:

板凳
+30
请使用DownloadToFileAsync()。

为了获得最佳性能,建议尝试多个值,并测量吞吐量。

一个开始的地方是将parallelIOCount设置为CPU数量。

然后调整rangeSizeInBytes,使parallelIOCount次数rangeSizeInBytes等于您希望进程使用的内存量。

此方法的优点vs < code> DownloadToFileAsync 是并行下载文件的多个“切片”(同时)。这对于通过快速互联网连接的大型文件是有益的(在大多数情况下,我预计它会快4-8倍)。 建议尝试几个值,并测量吞吐量。

一个开始的地方是将parallelIOCount设置为CPU数。

然后调整rangeSizeInBytes以便parallelIOCount次rangeSizeInBytes等于您希望进程使用的内存量。

此方法与 DownloadToFileAsync 的好处是可以下载文件的多个“切片”平行(同时)。这对于通过快速互联网连接的大型文件是有益的(在大多数情况下,我预计它会快4-8倍)。 建议尝试几个值,并测量吞吐量。

一个开始的地方是将parallelIOCount设置为CPU数。

然后调整rangeSizeInBytes以便parallelIOCount次rangeSizeInBytes等于您希望进程使用的内存量。

此方法与 DownloadToFileAsync 的好处是可以下载文件的多个“切片”平行(同时)。这对于通过快速互联网连接的大型文件是有益的(在大多数情况下,我预计它会快4-8倍)。 / p>

然后调整rangeSizeInBytes,使parallelIOCount次数rangeSizeInBytes等于您希望进程使用的内存量。

此方法的优点与 DownloadToFileAsync 是并行下载文件的多个“切片”(同时)。这对于通过快速互联网连接的大型文件是有益的(在大多数情况下,我预计它会快4-8倍)。 / p>

然后调整rangeSizeInBytes,使parallelIOCount次数rangeSizeInBytes等于您希望进程使用的内存量。

此方法的优点与 DownloadToFileAsync 是并行下载文件的多个“切片”(同时)。这对于通过快速互联网连接的大型文件是有益的(在大多数情况下,我预计它会快4-8倍)。 该文件的并行下载(同时)。这对于通过快速互联网连接的大型文件是有益的(在大多数情况下,我预计它会快4-8倍)。 该文件的并行下载(同时)。这对于通过快速互联网连接的大型文件是有益的(在大多数情况下,我预计它会快4-8倍)。

27
votes
answers
22 views
+10

我怎么能避免== null检查?

这是我在项目中广泛使用的代码,我想知道我可以以某种方式重构这个,所以我可以一直避免 == null 检查吗?

  ActiveCompany = admin.Company == null?false:admin.Company.Active   

谢谢你们

干杯

up vote 14 down vote accepted favorite
沙发
+140
+50

您可以使用C#6: Null-conditional Operator

  ActiveCompany = admin.Company?.Active == true;   

最后与 true 的比较将 bool?转换为 bool 您还可以使用null合并运算符来处理空值,如Keith所示。

@ Roxy'Pro blogs.msdn.microsoft.com/jerrynixon/2014/02/26/ - dedecos 8月28日11:00

+120
与空条件链接的

null合并运算符对于这种事情很有用: -

  ActiveCompany = admin.Company?.Active ?? false  
     
			
        
+10

如果你发现自己这么做糟糕很多,你可以编写一个扩展方法来简化代码。

例如,假设你有这些类:

  public sealed class Company {public bool Active {get; 组; 公共密封类MyClass {public Company Company; }   

然后你可以这样编写一个扩展方法:

  public static class MyClassExt {public static bool IsActiveCompany(this MyClass myClass){return myClass。公司?。活跃?假;   

这意味着您可以编写如下代码:

  var test = new MyClass(); // ... bool activeCompany = test.IsActiveCompany();  
     
			
        
0
votes
answers
55 views
+10

如何在VS2017的C#中爲SQL Server Management Studio創建擴展?

1

我想寫SSMS 2017簡單的擴展,對於我跟着簡單的Hello World樣品從Microsoft Docs如下:如何在VS2017的C#中爲SQL Server Management Studio創建擴展?

  1. 從擴展項目模板創建VSIX項目

  2. 更改「啓動外部程序」在Project> Properties> Debug to 「C: Program Files(x86) Microsoft SQL Server 140 Tools Binn ManagementStudio Ssms.exe」。

    在命令行參數中添加「-S(localdb) MSSQLLocalDB -d sampleDB -E」作爲
    它需要指定servername/database來運行SSMS.exe。

  3. 使用添加新項

  4. 運行該項目

如果2 &#3,不執行步驟#,它工作正常使用Visual Studio,但是什麼也沒有發生與SSMS添加自定義命令,儘管它啓動了SSMS。

我是否錯過了某些東西,或者是否對創建SSMS加載項有任何限制?

+0

你確定你的項目已經註冊了正確的註冊表項嗎?例如SSMS 14,它是'HKCU Software Microsoft SQL Server Management Studio 12xxx'而不是'HKCU Software Microsoft VisualStudio' –

+0

我正在從VS本身調試,我應該在哪裏尋找註冊表? – usercr

+0

你解決了這個問題嗎? –

沙发
0
1

首先,你需要聲明SSMS支持你source.extension.vsixmanifest文件:

<Installation> 
    <InstallationTarget Id="ssms" Version="[14.0, 14.0]" /> 
    </Installation> 

那麼我不認爲VS可以自動安裝的擴展SSMS。所以,手動運行.vsix文件。

+0

我已經添加了安裝目標和運行vsix,但是,它仍然無法正常工作。 – usercr

0
votes
answers
35 views
+10

數組設置拋出啓動時出現錯誤 - CS0021錯誤(C#)

0

我想通過創建一個小程序來練習創建數組,該程序允許用戶輸入數組中的元素數量,然後創建一個數組用戶輸入的元素,並用數字填充所有元素。例如:如果輸入3,則會生成3個元素,將元素1填入數字1,數字2填入數字2,依此類推。雖然我每次都得到一個特定的錯誤:CS0021無法應用與[]的索引類型爲 這裏的「法團」的表達是我的代碼:數組設置拋出啓動時出現錯誤 - CS0021錯誤(C#)

 static void Main(string[] args) 
    { 
     int num; 
     string getNum; 
     getNum = Console.ReadLine(); 
     num = Int32.Parse(getNum); 
     int[] array = new int[num]; 
     Console.WriteLine("Array created with {0} elements.",num); 
    } 
    static void Array(int input) 
    { 
     int num = 1; 
     int inum = input; 
     while(inum >= input) 
     { 
      Array[inum] = num; 
      Console.WriteLine("{0}",input); 
      Console.WriteLine("{0}", num); 
      inum = inum - 1; 
      num = num + 1; 
     } 

感謝提前,如果你決定要幫我出:)

+1

'Array'已解析爲方法的名稱'void Array(int input)'。你想做什麼?你的方法'Array'沒有任何數組可用。 – InBetween

+0

嗯,我剛剛意識到我不應該問。被mindboggled很長一段時間,它錯誤,因爲我聲明數組和使用數組? (注意上限) 編輯:不,它不是,那不是原因。 – ImNotCrazy

+0

另外,我想要做的是我試圖給它的數字元素。 int [] array = new int [num];使用特定數量的元素聲明一個數組...並且array [inum] = num;應該給這些元素數字。 :/ – ImNotCrazy

沙发
0
0

在你的prgoram Array是一種方法。

因此行Array[inum] = num出錯,因爲Array是一種方法,您不能將索引器([])應用於方法。

最快捷的方式來實現你想要的東西類似下面的內容:

static int[] Array(int input) // Change return type to return an array of integers 
{ 
    var result = new int[input]; // Declare a local variable to hold a new array of size input. 

    // Change while to basic for loop 
    for (int i = 0; i < input; i++) 
    { 
     result[inum] = i + 1; // set elements of the result array. 
     Console.WriteLine("{0}",input); 
     Console.WriteLine("{0}", i); 
    } 
} 

在main方法:

static void Main(string[] args) 
{ 
    int num; 
    string getNum; 
    getNum = Console.ReadLine(); 
    num = Int32.Parse(getNum); 
    int[] array = Array(num); // Change this to call the Arrra(int num) method 
    Console.WriteLine("Array created with {0} elements.",num); 
} 

否則你可以使用一個簡單的LINQ聲明:

Enumerable.Range(1, input).ToArray(); 
+0

謝謝,從Array更改爲CreateArray的方法,它的工作!非常感謝! – ImNotCrazy

板凳
0
0

好的,讓我們稍微整理一下你的代碼,並儘量讓它做你想做的事:

讓我們從你的任何邏輯開始,從你的方法Main,並寫出具體的方法,採取小步驟實現你的目標。請記住,你製作方法越小,你就越難找到一個bug。如果你正在學習,開始荒謬的小事,隨着你的信心增長變得更大。

好的,有一個要求用戶輸入數字的概念,讓我們編寫一個方法來實現這一點,並儘可能在過程中儘可能強健。請記住,用戶是愚蠢的!要求一個號碼,他們會輸入什麼,但:

public static int PromptUserForPositiveInteger(string prompt) 
{ 
    int number; 
    Console.Write(prompt); 
    var input = Console.ReadLine(); 

    while (!int.TryParse(input, out number) || 
      number < 0) 
    { 
     Console.Write("Input is not a valid number, try again: "); 
     input = Console.ReadLine(); 
    } 

    return number; 
} 

好了,這是什麼方法做的是問一個正整數的用戶,並且將繼續這樣做,直到用戶管理輸入有效編號或拔插頭。無論哪種方式,我們都很安全。 int.TryParse是從string中提取int的安全方式;如果有可能這樣做,它會給你一個號碼並返回true,否則會返回false。如果它失敗了,它不會做的就是炸燬你的臉,這是int.Parse非常樂意去做的事情。避免Parse喜歡瘟疫,總是使用frendlier TryParse

另外值得一提的是,這種方法是一個實現細節,所以它的private。沒有人需要使用它,所以不要顯示它。

另請注意,我們可以概括這使得調用者指定如何提示用戶。沒有理由爲什麼你只想將這種方法限制在數組大小上,也許明天你需要的數量是你要給猴子喂的香蕉!每當它便宜又容易時,推廣你的代碼。每當泛化很難,不要,你可能不會需要它和它的浪費的努力。

現在,我們需要的下一個任務是製作一個int數組並填充它的值。該值將是每個數組元素的索引。哦,但是等一下,我們說我們會爲每項任務制定一個方法,不管它多麼荒謬!是的,我知道,但荒謬的是,小到目前爲止。

private static int[] CreatArrayAndSetValuesToIndex(int size) 
{ 
    Debug.Assert(size >= 0); 
    var array = new int[size]; 

    for (var i = 0; i < size; i++) 
    { 
     array[i] = i; 
    } 

    return array; 
} 

CreatArrayAndSetValuesToIndex似乎荒謬長的名字,但它會告訴你什麼方法呢。習慣使用描述性名稱並避免縮寫。現在使用intellisense,使用簡短的神祕名字是沒有意義的。

另請注意參數驗證。我永遠不會強調這一點:總是驗證您的方法輸入!。如果事情在某些條件下不應該起作用,那麼確保你正在盡一切可能來避免這些情況。由於該方法是私人的,Debug.Assert就足夠了。如果它是公共表面的一部分,你需要拋出一個適當的例外(ArgumentOutOfRange作爲一個合適的例子)。

最後但並非最不重要的,讓我們寫自己,打印出int陣列,這樣我們可以確保我們的代碼是運作良好的最後一個方法:

private static void PrintOut(int[] array) 
{ 
    Console.WriteLine(string.Join(Environment.NewLine, array); 
} 

我已經採取了這裏利用了已有的工具該框架。 string.Join是一個非常漂亮的小方法,它接受任何可枚舉對象(數組就是其中之一),並使用給定的分隔符創建其所有成員的字符串,在這種情況下爲新行。

而現在,所有這就是左邊是把他們放在一起:

static void Main(string[] args) 
{ 
    var size = PromptUserForPositiveInteger("Enter array size: "); 
    var array = CreatArrayAndSetValuesToIndex(size); 
    PrintOutArray(array); 
    Console.ReadLine(); 
} 

,我們就大功告成了!

0
votes
answers
32 views
+10

C#和本地數據庫(訪問)

0

我需要幫助顯示listbox輸出到標籤的數據。 在listbox一切都加載(我需要看到FirstnameLastName),但它不會在標籤上寫任何東西 - 總是一個錯誤。C#和本地數據庫(訪問)

private void listBox1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     try 
     { 
      connection.Open(); 
      OleDbCommand command = new OleDbCommand(); 
      command.Connection = connection; 
      string query = "SELECT * FROM Tab1 WHERE groupA='" + listBox1.Text + "' ORDER BY FirstName"; 
      command.CommandText = query; 

      OleDbDataReader reader = command.ExecuteReader(); 
      while (reader.Read()) 
      { 
       listBox3.Items.Add(reader["FirstName"].ToString() + " " + reader["LastName"].ToString()); 
      } 

      connection.Close(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("ERROR" + ex); 
     } 
    } 

listBox3_SelectedINdexChanged

 
private void listBox3_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      try 
      { 
       connection.Open(); 
       OleDbCommand command = new OleDbCommand(); 
       command.Connection = connection; 
       string query = "select * from Tab1 where FirstName=" + listBox2.Text + ""; 
       command.CommandText = query;

OleDbDataReader reader = command.ExecuteReader(); while (reader.Read()) { label6.Text = reader["FirstName"].ToString(); label8.Text = reader["LastName"].ToString(); label10.Text = reader["GroupPolice"].ToString(); } connection.Close(); } catch (Exception ex) { MessageBox.Show("ERROR" + ex); } }

謝謝。 enter image description here

+0

'總是error.'總是告訴我們的錯誤。 – LarsTech

+0

你必須使用參數來避免sql注入和格式錯誤,這可能是你的問題。一個標籤只能顯示一個值,所以while循環沒有意義。使用'if(reader.Read())'代替。 – LarsTech

沙发
0
0

更改第二個查詢:

string query = "select * from [Tab1] where FirstName='" + listBox2.Text + "'"; 

而且while (reader.Read())到:

if (reader.Read())