Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.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#_Algorithm_Linq_Logic - Fatal编程技术网

C# LINQ考虑双倍比较元素

C# LINQ考虑双倍比较元素,c#,algorithm,linq,logic,C#,Algorithm,Linq,Logic,我的目标是将无数的船只分组。 船舶群是指相互之间相距0.5英里以内的船舶 UPD:假设我们有一条河流,比如密西西比河。船正漂过它。 我的目标是根据他们的位置对他们进行分组。不是坐标而是英里数(例如19.3英里),因此,如果我们有一艘船在19.3英里处,而另一艘船在19.5英里处,我们将它们聚为一组。但如果我们在193英里处还有另一艘船,我们就不能把它加入我们刚刚分组的两艘飞船中 我们拥有的船舶集合中的未分组船舶:(所有河流和地点) 我数不清 我想知道在我的询问中我怎么能考虑英里比较?< /P>

我的目标是将无数的船只分组。 船舶群是指相互之间相距0.5英里以内的船舶

UPD:假设我们有一条河流,比如密西西比河。船正漂过它。 我的目标是根据他们的位置对他们进行分组。不是坐标而是英里数(例如19.3英里),因此,如果我们有一艘船在19.3英里处,而另一艘船在19.5英里处,我们将它们聚为一组。但如果我们在193英里处还有另一艘船,我们就不能把它加入我们刚刚分组的两艘飞船中

我们拥有的船舶集合中的未分组船舶:(所有河流和地点) 我数不清

我想知道在我的询问中我怎么能考虑英里比较?< /P>
var orderedShips = from ship in ungroupedShips
                   orderby string.Intern(ship.River), ship.MileMarker ascending
                   group ship by string.Intern(ship.River) into shipRiverGroup
                   select new BargeGroup { Ships = shipRiverGroup };

我不理解你的linq,但基于你的问题:

您可以使用truncate按数字间隔分组,如:

context.YourTable
    .GroupBy(g => (int)g.YourFieldDouble)
    .OrderBy(o => o.Key);
这将按整数值分组

如果您想分成0.5到0.5组,只需使用乘法和除法,如:

context.YourTable
    .GroupBy(g => (int)(g.YourFieldDouble * 2) / 2.0)
    .OrderBy(o => o.Key);
您也可以使用舍入法:

context.YourTable
    .GroupBy(g => Math.Round((double)g.YourFieldDouble * 2,
                             MidpointRounding.AwayFromZero) / 2.0)
    .OrderBy(o => o.Key)

由于缺乏信息,我会认为你有一个<代码>船< /代码>实体类,如:

class Ship
{
    public int Id { get; set; }
    public double MileMarker { get; set; }
    public string River { get; set; }
}
因此,要使同一条河流中彼此相邻的所有两艘船舶:

from s1 in context.Ships
from s2 in context.Ships
where Math.Abs(s1.MileMarker - s2.MileMarker) <= 0.5
   && s1.River == s2.River /* guarantee both ships are in same river. */
   && s1.Id != s2.Id /* avoid pair of one ship with itself. */
   && s1.MileMarker < s2.MileMarker /* avoid permutation duplicity */
select new { S1Mile = s1.MileMarker, S2Mile = s2.MileMarker, River = s1.River }

什么是
ungroupedShip
,它是数据库驱动的LINQ提供程序还是对象的LINQ?为什么要使用
string.Intern
?对于这样复杂的任务,信息太少了。显示类以及如何测量距离。@TimSchmelter,我已经更新了详细信息。“分组”的概念仅适用于定义了等价类的情况。但你们的关系——两艘飞船相距0.5英里——是不可传递的。您的关系定义的是图形,而不是分区。(如果A,B,C在一条直线上,A在0,B在0.3,C在0.6,那么(A,B)和(B,C)彼此之间的距离在0.5英里以内,但是(A,C)不是。)如果一艘船在
0.99
处,另一艘船在
1.01
处,它们将分为两个不同的组,不是吗?是的,如果你想让这两个在同一组中(组1)您需要使用round而不是truncate。这并不能解决问题。假设您有三个ship:
{A:0.5,B:1.0,C:1.5}
,您的代码将输出一个包含两个ship的组和一个包含一个ship的组。但是OP需要两组两艘船:
{A,B}
{B,C}
。对不起,我没有得到你需要做的,你能改进你的问题吗?试着更好地解释一下分组方式是如何构建的。我不是OP。但问题是:
船舶分组是指彼此之间相距0.5英里以内的船舶。
。在我的示例中,
{A,B}
{B,C}
都匹配该定义。
Ships = new List<Ship>
{
    new Ship { Id = 1, MileMarker = 0.2, River = "San" },
    new Ship { Id = 2, MileMarker = 0.4, River = "San" },
    new Ship { Id = 3, MileMarker = 0.8, River = "San" },
    new Ship { Id = 4, MileMarker = 0.1, River = "Joe" },
    new Ship { Id = 5, MileMarker = 0.4, River = "Joe" },
    new Ship { Id = 6, MileMarker = 0.3, River = "Joe" },
};
S1Mile    S2Mile    River

   0.2       0.4    San 
   0.4       0.8    San 
   0.1       0.4    Joe 
   0.1       0.3    Joe 
   0.3       0.4    Joe