【问题标题】:Create all combinations of two sets创建两组的所有组合
【发布时间】:2015-12-11 05:42:59
【问题描述】:

我有两个字符串列表,它们实际上是数据库中主键的值:

        List<string> hisSpecialtyKeysInDB = this.Repository.GetSpecialtyKeysOfThisProvider(providerKey);
        List<string> hisAddressKeysInDB = this.Repository.GetAddressKeysOfThisProvider(providerKey);

它们中的任何一个都可能有价值,也可能没有价值。

我想要这两个列表可能具有的这些主键的所有可能组合的组合。 (例如,如果一个有 3 个项目,另一个有两个项目,我想看 6 个项目)

我在下面写了这个查询,但它的计数为零,这是错误的。 在我的测试中,其中一个包含零项,另一个包含三个,所以我希望返回三个。可以将空的作为string.Empty,这对我来说很好。

        var temp = from ps in hisAddressKeysInDB
                   from pa in hisSpecialtyKeysInDB
        select new
        {
            PS = ps,
            PA = pa
        };

        int xxxxx = temp.Count();

【问题讨论】:

  • 如果 string.Empty 可以很好地表示一个空列表,为什么不把它放到一个空列表中呢? if (hisSpecialtyKeysInDB.Count == 0) hisSpecialtyKeysInDB.Add(string.Empty);

标签: c# linq


【解决方案1】:

您可以使用DefaultIfEmpty 扩展方法来实现您所需要的。例如

var temp = from ps in hisAddressKeysInDB.DefaultIfEmpty("")
           from pa in hisSpecialtyKeysInDB.DefaultIfEmpty("")
           where ps != "" || pa != "" // This is to remove the edge case when both are empty
           select new
           {
               PS = ps,
               PA = pa
           };

【讨论】:

  • 计数仍然返回零。
  • 对不起。我发帖后注意到where 条件错误。我放了一个&amp;&amp; 而不是||
  • 一个问题:如果对于空值的默认值我选择另一个默认值而不是空字符串,例如单词“NOP”,那么在你的 where 子句中我还必须将那些空字符串更改为“NOP”?
  • 没错。每个空字符串都应替换为新的默认值。
猜你喜欢
  • 2020-02-29
  • 1970-01-01
  • 1970-01-01
  • 2016-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多