2

为什么外部数据源的更改没有反映,而它们显示在内部数据源中?请帮忙

public static void MyMethod(char[] inputDS1, char[] inputDS2)
{
    Console.WriteLine("\n'from' clause - Display all possible combinations of a-b-c-d.");

    //query syntax
    IEnumerable<ChrPair> resultset = from res1 in inputDS1
                                     from res2 in inputDS2
                                     select new ChrPair(res1, res2);

    //Write result-set
    Console.WriteLine("\n\nOutput list -->");
    displayList(resultset);

    //swap positions
    //obs: changes to the first ds is not reflected in the resultset.
    char[] temp = inputDS1;
    inputDS1 = inputDS2;
    inputDS2 = temp;

    //run query again
    displayList(resultset);
    Console.WriteLine("\n------------------------------------------");
}

输入:

('a','b'), ('c','d')

输出:

ac, ad, bc, bd, **aa. ab, ba, bb**

当我在第二次写入之前交换数据源时,我期望所有可能的组合(ac、ad、bc、bd、ca、cb、da、db )。当我在第二次写入之前执行 ToList() 时,我得到了预期的结果,是因为 Select 是懒惰的吗?请解释。

更新

我尝试的是 - 在 ds-swap 之后向查询表达式添加一个 ToList() (强制立即执行)。我得到了正确的结果——ac、ad、bc、bd、ca、cb、da、db。这将返回预期的结果。

//query syntax
IEnumerable<ChrPair> resultset = from res1 in inputDS1
                                from res2 in inputDS2
                                select new ChrPair(res1, res2);

//Write result-set
Console.WriteLine("\n\nOutput list -->");
displayList(resultset);

//swap positions
//obs: changes to the first ds is not reflected in the resultset.
char[] temp = inputDS1;
inputDS1 = inputDS2;
inputDS2 = temp;

resultset = (from res1 in inputDS1
            from res2 in inputDS2
            select new ChrPair(res1, res2)).ToList();

//run query again
displayList(resultset);
4

3 回答 3

1

你得到的是 chars frominputDS1和 chars frominputDS2的组合。这就是查询

    IEnumerable<ChrPair> resultset = from res1 in inputDS1
                                     from res2 in inputDS2
                                     select new ChrPair(res1, res2);

确实,这就是您从中提出的要求:“取 1 个项目inputDS1和 1 个项目inputDS2然后将两者结合起来new ChrPair

编辑

在理解你的问题之后,让我解释一些非常基本的东西:

线

    IEnumerable<ChrPair> resultset = from res1 in inputDS1
                                     from res2 in inputDS2
                                     select new ChrPair(res1, res2);

不返回列表或IEnumerable<ChrPair>. 它返回一个具有源 ( inputDS1) 和输入的方法。当你交换两者时,你会弄乱方法的输入,但源并没有改变(它可能是复制的,而不仅仅是引用)。当您.ToList();激活该方法时,不会因之后调用的命令而出现任何意外行为。

于 2013-09-15T08:15:14.360 回答
1

我认为,问题在于第一个变量(inputDS1)不包含在任何匿名函数(lambda)中,那么编译器不会为它生成闭包。

编译器将查询转换为如下内容:

IEnumerable<ChrPair> resultset = 
    inputDS1.SelectMany(c => inputDS2.Select(c1 => new ChrPair(c, c1)));

如您所见,inputDS1不包含在任何匿名(lambda)中。相反,inputDS2lambda then 中的 contains 编译器将为它生成闭包。因此,在您第二次执行查询时,您可以访问修改后的闭包inputDS2

于 2013-09-15T10:10:57.413 回答
-1

据我所知,这部分

char[] temp = inputDS1;
    inputDS1 = inputDS2;
    inputDS2 = temp;

交换输入参数,而不是您从 linq 语句中获得的结果。

于 2013-09-15T08:26:13.383 回答