小编Azz*_*rel的帖子

为什么LINQ中的LastOrDefault(predicate)比FirstOrDefault(predicate)快

介绍

我注意到,在今天使用某些LinQ函数测试性能差异时,它LastOrDefault(predicate)几乎总是比快FirstOrDefault(predicate),这引起了我一些兴趣,因此我编写了一些测试用例,以对两个函数进行相互测试。

我创建了一个integer从1到100万的值列表,如下所示:

List<int> l = new List<int>();
for (int i = 1; i <= 1000000; i++)
  {
    l.Add(i);
  }
Run Code Online (Sandbox Code Playgroud)

然后写了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);
}
Run Code Online (Sandbox Code Playgroud)

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

测试用例 …

c# linq performance .net-core

8
推荐指数
1
解决办法
217
查看次数

将依赖注入与单例设计模式混合

我的项目中有一个单例,如下所示:

//Create a Singleton
static MySingleton Instance;
private static readonly object Padlock = new object();
/// <summary>
/// Singelton Method, to make sure only one instance of this class exists at runtime.
/// </summary>
/// <returns></returns>
public static MySingleton GetInstance()
{
  //Thread Safety
  lock (Padlock)
  {
    if (Instance == null)
    {
      Instance = new MySingleton();
    }
    return Instance;
  }
}

private MySingleton()
{
}

//[...]
Run Code Online (Sandbox Code Playgroud)

Singleton 包含几个其他类作为 Properties,它们永远不应该为 null。

通常我会使用DependencyInjection来保证每个新对象在实例化时获得所有必要的参数。像这样:

IHelperClass Helper {get; set;}

IExectiveClass Executive {get; set;} …
Run Code Online (Sandbox Code Playgroud)

c# singleton dependency-injection

7
推荐指数
1
解决办法
4004
查看次数

阻止 Visual Studio 在输出目录中复制 Nuget 包

免责声明:这是.Net Framework特有的问题,在 .Net Core 中不会发生。

我目前正在开发一个项目,该项目作为一个更大项目的插件。我想将项目的输出路径设置到较大项目的 AddIn 文件夹,然后使用项目的调试属性启动较大的项目,这样我就不必每次都手动复制并附加到项目。

我拥有的任何参考都是与较大的项目共享并从其管理的,这意味着我没有(也不应该)将它们复制到 AddIn 文件夹。

将此答案中的代码包含到我的 .csproj (VS 19/新格式)

  <ItemDefinitionGroup>
  <Reference>
    <Private>False</Private>
  </Reference>
  <ProjectReference>
     <Private>False</Private>
  </ProjectReference>
  </ItemDefinitionGroup>
Run Code Online (Sandbox Code Playgroud)

排除项目和常规引用,但在 .Net Framework 中,我的 Nuget 包中的所有.dll也会复制到输出路径。我也在寻找一种方法来禁用它,但还没有找到。

有没有办法阻止Nuget 包中的.dll被复制到 .Net Framework 中的输出路径?

.net csproj .net-framework-version visual-studio

5
推荐指数
1
解决办法
1185
查看次数

在运行时加载带有子文件夹引用的程序集

我目前正在开发一个项目,该项目应该作为多个附加组件的框架工作,这些附加组件应该在运行时加载。

我的任务是在我的应用程序文件夹中具有以下结构:

  • 2 带有子文件夹的目录。一个名为“ /addons ”的附加组件和一个名为“ /ref ”的用于这些插件可能使用的任何附加引用(如System.Windows.Interactivity.dll
  • 当从应用程序的菜单中选择一个附加组件时,.dll 应该在运行时加载,并且应该打开一个预设的入口点
  • 新加载的程序集的所有引用也应加载。

我知道加载附加组件时的子文件夹和文件名,因此我只需使用Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location))Path.Combine()构建 .dll 的路径,然后Assembly.LoadFile()在使用反射之前加载它assembly.GetExportedTypes()以找到为我的“EntryPointBase”继承的类,然后用Activator.CreateInstance().

但是,只要我的附加组件中有任何引用System.IO.FileNotFoundException就会弹出一个针对该引用的目标assembly.GetExportedTypes()

我构建了一个方法来加载所有引用的程序集,甚至递归地从引用加载所有引用,如下所示:

public void LoadReferences(Assembly assembly)
{

  var loadedReferences = AppDomain.CurrentDomain.GetAssemblies();

  foreach (AssemblyName reference in assembly.GetReferencedAssemblies())
  {
    //only load when the reference has not already been loaded 
    if (loadedReferences.FirstOrDefault(a => a.FullName == reference.FullName) == null)
    {
      //search in all subfolders
      foreach (var location in Directory.GetDirectories(Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location)))
      {
        //GetDirectoriesRecusrive searchs all …
Run Code Online (Sandbox Code Playgroud)

.net c# reflection .net-assembly .net-core

4
推荐指数
1
解决办法
1286
查看次数