【问题标题】:Using LINQ in cross-join query of a datatable in C#在 C# 中的数据表的交叉连接查询中使用 LINQ
【发布时间】:2013-04-24 16:11:58
【问题描述】:

我在使用 LINQ 进行数据表的交叉连接查询时遇到问题。

DataTable dt_edges = new DataTable();
dt_edges.Columns.Add("EdgeID", typeof(string));
dt_edges.Columns.Add("TriangleID", typeof(string));
dt_edges.Columns.Add("StartPointID", typeof(string));
dt_edges.Columns.Add("EndPointID", typeof(string));
dt_edges.Columns.Add("StartVerticeX", typeof(double));
dt_edges.Columns.Add("StartVerticeY", typeof(double));
dt_edges.Columns.Add("StartVerticeZ", typeof(double));
dt_edges.Columns.Add("EndVerticeX", typeof(double));
dt_edges.Columns.Add("EndVerticeY", typeof(double));
dt_edges.Columns.Add("EndVerticeZ", typeof(double));


var q = from a in dt_edges.AsEnumerable()
from b in dt_edges.AsEnumerable()

where (
a["StartVerticeX"].ToString() == b["StartVerticeX"].ToString()
&& a["StartVerticeY"].ToString() == b["StartVerticeY"].ToString()
&& a["EndVerticeX"].ToString() == b["EndVerticeX"].ToString()
&& a["EndVerticeY"].ToString() == b["EndVerticeY"].ToString()
)

select new { 
edgeID = a["EdgeID"],
aSVX = a["StartVerticeX"], 
aSVY = a["StartVerticeY"],
bSVZ = b["StartVerticeX"], 
bSVY = b["StartVerticeY"]
};

foreach (var item in q)
{
textBox2.Text += item.edgeID.ToString() + ": " + item.aSVX.ToString() + " " + item.aSVY.ToString() + ", " + item.bSVZ.ToString() + " " + item.bSVY.ToString() + "\n";
}

当我运行代码时,我在dataTable中只有5条记录,但是q的计数结果是225! 当我检查结果时,有多个重复的连接记录,过滤器似乎不能正常工作。

我想做的是只过滤那些在数据表中具有相同 StartX 和 StartY 以及 EndX 和 EndY 的那些。但是,我无法解决此问题。

期待您的帮助。 干杯。

【问题讨论】:

  • 听起来它工作得很好,只是你没想到你得到的结果。我希望使用这种类型的过滤器会有 很多 个重复项。您需要弄清楚您想要什么,以及如何描述您想要什么,我们才能为您提供帮助。
  • 如果你想对共享坐标的项目进行分组,你可以使用“group by”操作符。正如@Servy 所说,您所追求的并不是特别清楚。

标签: c# linq datatable cross-join


【解决方案1】:

具有共同数据的行? => group by!

var q = from a in dt_edges.AsEnumerable()
group a by new { sx = a["StartVerticeX"], 
                 sy = a["StartVerticeY"],
                 ex = a["EndVerticeX"],
                 ey = a["EndVerticeY"] } into g
where g.Count() > 1
from row in g select row;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-11
    • 1970-01-01
    • 2014-03-17
    • 2017-01-26
    • 1970-01-01
    • 2012-12-31
    相关资源
    最近更新 更多