C#LINQ - 获取对,当第二个值在具有相同第一个值的所有对中为空时

时间:2016-04-02 10:54:54

标签: c# linq

假设我有这样的对(在列表中):[{a,15},{b,null},{a,null}]

每对都有一个字符键和一个可以为空的值。我想选择列表中不包含具有相同键和非空值的另一对的所有对。

在上面的示例列表中,我只想获得{b,null},因为'a'在第一对中具有非空值。我如何使用LINQ做到这一点?

3 个答案:

答案 0 :(得分:0)

假设列表(变量名称项)是一个集合(chr,Id),然后使用以下linq来获得结果

        var result = (from t1 in items
                      group t1 by t1.chr into t2
                      where t2.Count(p => p.Id!= null) == 0
                      select new
                      {
                          chr = t2.Key,
                          Id  = t2.Select(p => p.Id).FirstOrDefault()
                      }).ToList();

答案 1 :(得分:0)

您可以使用Where函数选择元素,同时使用Any函数检查是否存在具有相同键值和非空值的对。这是一个例子:

class Pair
{
    public char Key { get; set; }
    public int? Value { get; set; }
}

var pairs = new[] { new Pair { Key = 'a', Value = 15 },
                    new Pair { Key = 'b', Value = null },
                    new Pair { Key = 'a', Value = null }
}

var nullOnlyPairs = pairs.Where(p => !pairs.Any(a => a.Key == p.Key && a.Value != null));

答案 2 :(得分:0)

假设您的列表项有两个字段(键,值),您可以这样做。

var output = items.GroupBy(c=>c.Key) // Group by Letter
                  .Where(c=>!c.Any(e=>e.Value != null)) // Verify each Key has any other value than Null
                  .Select(c=>c.First());