Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过Linq在集合中查找不匹配的项_C#_Linq - Fatal编程技术网

C# 通过Linq在集合中查找不匹配的项

C# 通过Linq在集合中查找不匹配的项,c#,linq,C#,Linq,我有一个来自数据库的结果集,我对它进行了一些处理,最后将其存储在一个列表中。 在此列表中,结果如下所示: Field 1: ID1 Field 2: ID2 Summary: AA Value: 15 Field 1: ID3 Field 2: ID2 Summary: AA Value 20 Field 1: ID1 Field 2: ID4 Summary: AA Value 25 Field 1: ID1 Field 2: ID4 Summary: AA Value 5 Field

我有一个来自数据库的结果集,我对它进行了一些处理,最后将其存储在一个列表中。 在此列表中,结果如下所示:

Field 1: ID1
Field 2: ID2
Summary: AA
Value: 15

Field 1: ID3
Field 2: ID2
Summary: AA
Value 20

Field 1: ID1
Field 2: ID4
Summary: AA
Value 25

Field 1: ID1
Field 2: ID4
Summary: AA
Value 5

Field 1: ID1
Field 2: ID4
Summary: AB
Value 5
如果从另一个角度来看,它看起来像一个网格:

           ID2   ID4
ID1: AA    15    30
ID1: AB           5
ID3: AA    20
所有可以组合在一起的值(例如:ID4、ID1、摘要AA)都被添加到一起。 我需要做的是将0值应用于相交中不存在的数据。所以ID2/ID1/AB不存在。我需要在列表中有一个项目表示“存在”,但其值为零。

感谢所有的帮助

请查看合并运算符(?)

例如:

string s = s2 ?? "0";
当s2为空时,s将为“0”


有关更多信息,请参见此处:

Visual Studio中是否有一些代码?请将其粘贴到此处可能是空合并运算符的一种情况:??好极了谢谢。为什么使用.DefaultIfEmpty()?如果不传递一个参数,它似乎是多余的。。。还是我错过了一个用例?@Flater是的,他仍然希望明确地看到0,否则你会错过它们。在Linqpad中进行测试,您将看到差异
DefaultIfEmpty
不仅仅是决定什么是默认值,它实际上是用来为“缺失项”生成数据的(以默认值的形式,在本例中为
null
)。
var items = new [] {
    new { F1 = "ID1", F2 = "ID2", S = "AA", V = 15 },
    new { F1 = "ID3", F2 = "ID2", S = "AA", V = 20 },
    new { F1 = "ID1", F2 = "ID4", S = "AA", V = 25 },
    new { F1 = "ID1", F2 = "ID4", S = "AA", V = 5  },
    new { F1 = "ID1", F2 = "ID4", S = "AB", V = 5  },
};

var f2s = items.Select(i => i.F2).Distinct();

var table =
    from i in items
    group i by new { i.F1, i.S } into g
    select new 
    { 
        g.Key, 
        V = 
            from f in f2s
            join x in g on f equals x.F2  into ps 
            from p in ps.DefaultIfEmpty()
            select new { F = f, V = p != null ? p.V : 0 } into w
            group w by w.F into h
            select new { h.Key, V = h.Sum(c => c.V) }
    };