C# - Linq join返回意外数量的元素

时间:2016-12-20 10:29:24

标签: c# linq join

我有两个数据结构的数据,我想加入日期。每个数据结构包含88个值,并且一个结构中的每个日期在另一个结构中具有相应的日期。但是,当我尝试连接它们时,具有连接结果的列表包含90个值。换句话说,结果包含两个额外的值。当我检查连接列表中的值时,它似乎在列表的开头包含两个额外的值,这些值与第一个"预期的"相同。加入了价值。  什么想法可能是错的? 这是我正在使用的连接表达式:

//Joins vib and RPM with respect to date
var joinedVibRPM = serie.Value.Values.Join(
                    RPMSeriesOne.Values,
                    _vib => _vib.DateTime,
                    _rpm => _rpm.DateTime,
                    (_vib, _rpm) => new { vib = _vib.Value, rpm = _rpm.Value }).ToList();

2 个答案:

答案 0 :(得分:2)

如果在任一结构中有任何重复日期,则一个结构中的一个元素将匹配另一个结构中的2个(或更多)元素。这将为您提供超过88个结果。

检查您的结构是否有不同的值:

RPMSeriesOne.Values.Distinct().Count();

C:\temp\My\My_Ant.xml:20: Execute failed: java.io.IOException: Cannot run program "C:\PROGRA~1\Java\jre7\bin\java.exe -jar C:\temp\My\javatest.jar" (in directory "C:\temp\My"): CreateProcess error=2, The system cannot find the file specified
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1047)
    at java.lang.Runtime.exec(Runtime.java:617)
    at org.apache.tools.ant.taskdefs.launcher.Java13CommandLauncher.exec(Java13CommandLauncher.java:58)
    at org.apache.tools.ant.taskdefs.Execute.launch(Execute.java:426)
    at org.apache.tools.ant.taskdefs.Execute.execute(Execute.java:440)
    at org.apache.tools.ant.taskdefs.ExecTask.runExecute(ExecTask.java:629)
    at org.apache.tools.ant.taskdefs.ExecTask.runExec(ExecTask.java:670)
    at org.apache.tools.ant.taskdefs.ExecTask.execute(ExecTask.java:496)
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:293)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
    at org.apache.tools.ant.Task.perform(Task.java:348)
    at org.apache.tools.ant.Target.execute(Target.java:435)
    at org.apache.tools.ant.Target.performTasks(Target.java:456)
    at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1405)
    at org.apache.tools.ant.Project.executeTarget(Project.java:1376)
    at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
    at org.apache.tools.ant.Project.executeTargets(Project.java:1260)
    at org.apache.tools.ant.Main.runBuild(Main.java:854)
    at org.apache.tools.ant.Main.startAnt(Main.java:236)
    at org.apache.tools.ant.launch.Launcher.run(Launcher.java:285)
    at org.apache.tools.ant.launch.Launcher.main(Launcher.java:112)

其中一个结果可能小于88,表明存在重复。

答案 1 :(得分:2)

您可以在输入集具有重复条目时解释结果。例如,考虑这两个列表的连接,每个列表包含四个项目(使用字符串,而不是var items1 = new { "A", "B", "C", "C" }; var items2 = new { "A", "B", "B", "C" }; 以获得更好的可读性):

var joinedItems =
    from item1 in items1
    join item2 in items2 on item1 equals item2
    select item1 + item2;

如果您执行此加入:

{ "AA", "BB", "BB", "CC", "CC" }

您的结果将是:

"BB"

你会发现"CC"两次,因为它在secod列表和{{1}}中重复两次,因为它在第一个列表中重复。总共你会得到 5 项目。