【问题标题】:Query a List of List of Items in LINQ c#在LINQ c#中查询项目列表
【发布时间】:2010-05-08 17:18:46
【问题描述】:

我对 LINQ 有点陌生,这是我的问题。

  • 我有一个项目列表
  • 我喜欢获取存在于 只有一个列表(如果我能得到 他们没有的清单 重新遍历“列表 列表”,那会很棒)。

我尝试在 Linq 查询中使用 Aggregate / except / Group 关键字但没有成功,但到目前为止还没有接近解决方案。

[编辑] 例如可能是 List<List<int>> 并且 int 的值不在其他列表中的条件。

老实说,如果我尝试了几个 foreach,我成功找到了价值项,但是当我尝试学习 LINQ 时,我想知道我应该编写什么样的查询来获得结果

例如

 1,2,6
 1,6
 3,5
 5,10
 3,10,6

将返回 2 和第一个列表

【问题讨论】:

  • 选择其中一个列表的条件是什么?如果它包含给定的值?
  • 很难在没有看到您的结构的情况下提供帮助。贴一些代码和一些不起作用的例子。
  • 如果第一个列表是 {1,2,6,2} 怎么办?无论如何它应该返回“2”?
  • @digEmAll : no 在这种情况下它返回 null。对此我不清楚。

标签: c# linq


【解决方案1】:
var query = from list in lists
            from value in list
            where lists.Where(l => l.Contains(value)).Any()
            select new { List = list, Value = value };

【讨论】:

  • 我选择了那个,因为它是最简单、最容易阅读的有效解决方案。非常感谢 John Rasch、Matthew Whited,因为他们的命题也给出了正确的答案。
  • @Roger Alsing 你能告诉我究竟什么是“价值”吗?
【解决方案2】:

这将为您提供唯一的整数:

var ints = listOfLists.SelectMany(l => l);
var uniques = ints.Where(i => ints.Count(val => val == i) == 1);

【讨论】:

    【解决方案3】:
    from lst in lists
    from i in lst
    group lst by i into grp
    where grp.Count() == 1
    select new { Value = grp.Key, List = grp.Single() };
    

    这将为您提供仅出现在 1 个列表中的数字以及包含它的列表

    编辑:简化一点

    【讨论】:

    • 我尝试了这个提议,但它没有给出预期的结果(在测试样本上它返回空)。
    • 我在发布之前使用您的示例数据进行了尝试,它对我来说效果很好......它也比您接受的解决方案更有效率
    • 刚刚再试一次,我确认它工作正常...它返回 2,列表中包含 2
    【解决方案4】:
    var sets = new[] { "1,2,6", "1,6", "3,5,9", "5,10", "3,10,6" };
    
    var grouped = sets.SelectMany(i => i.Split(','))
                      .GroupBy(i => i)
                      .Where(i => i.Count() == 1)
                      .Select(i => i.Key);
    
    Console.WriteLine(string.Join(", ", grouped.ToArray())); //2, 9
    

    【讨论】:

      【解决方案5】:

      看起来我想出了与 Thomas 相同的解决方案,只是使用了函数式语法...

      var uniques = listlist.SelectMany(l => l.Select(i => new {Item = i, Origin = l}))
                            .GroupBy(i => i.Item)
                            .Where(g => g.Count() == 1)
                            .Select(g => g.First());
      

      请注意,我们所有的解决方案都假设每个列表中的数字已经不同;即,如果一个列表包含一个不在其他列表中的重复值,它仍然会被拒绝。

      【讨论】:

        猜你喜欢
        • 2022-10-12
        • 1970-01-01
        • 1970-01-01
        • 2022-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-13
        • 2019-04-15
        相关资源
        最近更新 更多