小编Kri*_*per的帖子

为什么不能修剪数组?

在MSDN文档站点上,它说明了以下有关该Array.Resize方法的信息:

如果newSize大于旧数组的Length,则分配一个新数组,并将所有元素从旧数组复制到新数组.

如果newSize小于旧数组的长度,则分配一个新数组,并将元素从旧数组复制到新数组,直到填充新数组为止.旧数组中的其余元素将被忽略.

数组是一系列相邻的存储块.如果我们需要一个更大的阵列,我理解我们不能为它添加内存,因为它旁边的内存可能已经被其他一些数据声明了.所以我们必须要求一个具有所需更大尺寸的新的相邻内存块序列,复制我们的条目并删除我们对旧空间的主张.

但为什么要创建一个更小尺寸的新阵列?为什么数组不仅可以删除它对最后一个内存块的声明?然后它将是O(1)操作而不是O(n),就像现在一样.

它是否与数据在计算机体系结构或物理层面的组织方式有关?

c# arrays memory-management

70
推荐指数
6
解决办法
5008
查看次数

在c#中旋转列表的最简单方法

列表说我有一个清单 List<int> {1,2,3,4,5}

旋转意味着:

=> {2,3,4,5,1} => {3,4,5,1,2} => {4,5,1,2,3}
Run Code Online (Sandbox Code Playgroud)

也许旋转不是最好的词,但希望你明白我的意思

我的问题,最简单的方法(简短的代码,c#4 Linq准备好),并且不会受到性能的影响(合理的性能)

谢谢.

c# linq arrays list

63
推荐指数
4
解决办法
2万
查看次数

当我向已解析的树添加标签时,lxml中的漂亮打印失败

我有一个xml文件,我正在使用lxml中的etree来处理,但是当我向它添加标签时,漂亮的打印似乎不起作用.

>>> from lxml import etree
>>> root = etree.parse('file.xml').getroot()
>>> print etree.tostring(root, pretty_print = True)

<root>
  <x>
    <y>test1</y>
  </x>
</root>
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.但现在

>>> x = root.find('x')
>>> z = etree.SubElement(x, 'z')
>>> etree.SubElement(z, 'z1').attrib['value'] = 'val1'
>>> print etree.tostring(root, pretty_print = True)

<root>
  <x>
    <y>test1</y>
  <z><z1 value="val1"/></z></x>
</root>
Run Code Online (Sandbox Code Playgroud)

它不再漂亮了.我还试图"向后"创建z1标签,然后创建z标签并将z1附加到它,然后将z标签附加到x标签.但我得到了相同的结果.

如果我不解析文件并只是一次创建所有标签,它将正确打印.所以我认为它与解析文件有关.

如何让漂亮的印刷工作?

python xml parsing lxml pretty-print

26
推荐指数
1
解决办法
8955
查看次数

在foreach循环中启动一个新线程

我有一个对象列表,我想循环遍历该列表并启动一个新线程,传入当前对象.

我写了一个我认为应该做的事情的例子,但它不起作用.具体来说,似乎线程在每次迭代时都会被覆盖.这对我来说真的没有意义,因为我每次都在创建一个新的Thread对象.

这是我写的测试代码

class Program
{
    static void Main(string[] args)
    {
        TestClass t = new TestClass();
        t.ThreadingMethod();
    }
}

class TestClass
{
    public void ThreadingMethod()
    {
        var myList = new List<MyClass> { new MyClass("test1"), new MyClass("test2") };

        foreach(MyClass myObj in myList)
        {
            Thread myThread = new Thread(() => this.MyMethod(myObj));
            myThread.Start();
        }
    }

    public void MyMethod(MyClass myObj) { Console.WriteLine(myObj.prop1); }
}

class MyClass
{
    public string prop1 { get; set; }

    public MyClass(string input) { this.prop1 = input; }
}
Run Code Online (Sandbox Code Playgroud)

我机器上的输出是 …

.net c# foreach multithreading

22
推荐指数
1
解决办法
3万
查看次数

无法使用架构比较进行更新

到目前为止,我能够使用Visual Studio 2012中的Schema Compare功能从数据库项目更新数据库.但是现在,对于一个项目,我可以进行比较,但更新按钮是灰色的.

我能够使用其他项目来更新其他数据库,但是从这个项目我无法更新任何数据库.我没有收到任何错误,功能只是不可用.

使用发布仍然有效.同样从数据库更新项目也起作用,而不是相反.

有谁知道为什么我无法通过Schema Compare更新数据库?

sql-server schema-compare visual-studio-2012

21
推荐指数
3
解决办法
2万
查看次数

无法将存储过程拖到dbml设计器上

我正在尝试从C#应用程序对数据库存储过程进行简单调用.

我正在按照指南,例如,这个这个.

这两者都具有相同的基本步骤.

  1. 将LINQ to SQL .dbml项添加到我的项目中
  2. 在Server Explorer中连接到数据库
  3. 将存储过程从Server Explorer拖到我的.dbml设计器窗口中

但第3步不起作用.我有我的存储过程和设计器窗口,但我无法拖动sproc.我没有加号或"不允许"的标志.它只是一个不可拖动的对象.

我找不到另一种方法将我的sproc添加到.dbml文件中.我找不到有这个问题的其他人.每个消息来源都只是说要拖过来.

我在这里做错了什么?

截图:

在此输入图像描述

sql-server stored-procedures visual-studio-2010 linq-to-sql

18
推荐指数
1
解决办法
1万
查看次数

在Linq中安全地解除引用FirstOrDefault调用c#

为了简洁起见,在我的代码中,我希望能够执行以下操作:拥有一个集合,找到匹配lambda表达式的第一个元素; 如果存在,则返回属性或函数的值.如果它不存在,则返回null.

更新的例子w.类

我们有一些东西

class Stuff
{
    public int Id { get; set; }
    public string Value { get; set; }
    public DateTime? ExecutionTime { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的目标是在调用它时很好地返回

var list = new Stuff[] { new Stuff() { Id = 1, Value = "label", ExecutionTime = DateTime.Now } };

// would return the value of ExecutionTime for the element in the list
var ExistingTime = list.FirstOrDefault(s => s.Value.Contains("ab")).ExecutionTime;

// would return null
var NotExistingTime = list.FirstOrDefault(s => s.Value.Contains("zzz")).ExecutionTime; 
Run Code Online (Sandbox Code Playgroud)

是否可以使用一些linq-syntax-fu或者我必须在继续之前明确检查返回值? …

c# linq syntax

17
推荐指数
2
解决办法
3173
查看次数

Process.Kill()似乎没有杀死进程

我无法使用Process.Kill().我想我一定是在误解它是如何运作的.这是我的测试功能.我开始一个长时间运行的进程(ping -t),然后在五秒后终止它.

我可以看到ping进程显示,但程序结束后进程仍然存在.我必须手动杀死它.

Console.WriteLine("Total number of ping processes is {0}", Process.GetProcessesByName("ping").Length);

ProcessStartInfo startInfo = new ProcessStartInfo("cmd.exe");
Process process = new Process();

startInfo.CreateNoWindow = true;
startInfo.UseShellExecute = false;
startInfo.Arguments = "/c ping -t 8.8.8.8";

Console.WriteLine("Staring ping process");
process.StartInfo = startInfo;
process.Start();
Thread.Sleep(5000);

Console.WriteLine("Total number of ping processes is {0}", Process.GetProcessesByName("ping").Length);
Thread.Sleep(5000);

Console.WriteLine("Killing ping process");
process.Kill();
Thread.Sleep(5000);

Console.WriteLine("Total number of ping processes is {0}", Process.GetProcessesByName("ping").Length);
Run Code Online (Sandbox Code Playgroud)

我在这做错了什么?

.net c# kill process

16
推荐指数
2
解决办法
1万
查看次数

在构造函数局部函数C#中设置只读字段

以下内容无法编译。

public class A
{
    private readonly int i;

    public A()
    {
        void SetI()
        {
            i = 10; 
        }

        SetI();
    }
}
Run Code Online (Sandbox Code Playgroud)

失败并显示以下错误:

CS0191不能将只读字段分配给它(在构造函数或变量初始化程序中除外)

从技术上讲,由于局部函数的可见性受到限制,我们仍然不在构造函数中,所以我想知道为什么它不能编译。

c# constructor compiler-errors readonly local-functions

15
推荐指数
1
解决办法
652
查看次数

是(>>)应该丢弃所有左侧输出?

我想我确实理解monad列表然后我发现我不是.这是故事.

给出列表m和功能k

> let m = [1..10]
> :t m
m :: [Integer]

> let k = replicate 2
> :t k
k :: a -> [a]
Run Code Online (Sandbox Code Playgroud)

玩bind >>=会给我的期望

> :t (>>=)
(>>=) :: Monad m => m a -> (a -> m b) -> m b
> :t m >>= k
m >>= k :: [Integer]
> m >>= k
[1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10]
Run Code Online (Sandbox Code Playgroud)

但对于 >>

预期(从IO monad体验,左侧的所有内容都将被丢弃)

m >> m
[1,2,3,4,5,6,7,8,9,10]
Run Code Online (Sandbox Code Playgroud)

拿到

> :t (>>) …
Run Code Online (Sandbox Code Playgroud)

monads haskell list

12
推荐指数
2
解决办法
547
查看次数