【问题标题】:String handling in c#?c#中的字符串处理?
【发布时间】:2021-12-20 03:17:33
【问题描述】:

我在下面有每个字符串:

MULTIPOLYGON(((107.067521 16.873693000000003,107.06849999999997 16.873613000000034)))

现在有什么方法可以将 107.067521 16.8736930000003 分组,将 107.06849999999997 16.873613000000034 分组并在每个组中将它们分开。组 107.067521 16.873693000000003 的示例将拆分 lat=107.067521, lng=16.873693000000003,对其余组执行相同操作。

【问题讨论】:

  • “组”对您意味着什么?您是在谈论正则表达式中的分组吗?还是您在谈论将字符串拆分为字段(解析)?还是别的什么?
  • 我有一个类 Point 有 2 个属性 lat 和 lng。我想拆分上面的字符串以将信息保存到 Point 类中的 lat vs lng
  • 您是否尝试过使用正则表达式来解析输入?

标签: c# string


【解决方案1】:

我想我会使用 Split 来完成所有工作:

var nums = input.Split(", ()".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

var points = new List<Point>();

for(int i = 1; i < nums.Length; i += 2){
  points.Add(new Point {
    Lat = double.Parse(nums[i+1],
    Lon = double.Parse(nums[i])
  });
}

请注意,在 WKT 表示中,更典型的是按“Long Lat”顺序排列 - 您说过 lat 排在第一位。如果您绝对确定您的字符串是“Long Lat”,则在循环内交换分配,但请先仔细检查,否则您最终可能会在地球上完全不同的部分绘制多边形

还有一点需要指出;你在这里只有一个多边形,如果你只有一个,那么像上面那样简单地解析它就可以了,但是使用一个多多边形是为了跟踪哪些多边形应该保持在一起。如果只有一个多边形,展平到一个点列表就可以了,但是如果你的字符串中真的有多个多边形,事情可能会变得很不稳定,例如

MULTIPOLYGON( (1 2,3 4,5 6,1 2) , (7 8,9 10,11 12,7 8) )

POLYGON( (1 2,3 4,5 6,1 2,7 8,9 10,11 12,7 8) )

这两个是完全不同的形状(后者不会关闭)。如果你真的有多个多边形,请注意它,并考虑一个更复杂的解析例程

【讨论】:

  • 其实我有一串很多多边形
  • 不是很明白,能不能给个具体的例子?
  • 我现在不能,因为我使用的手机无法正确呈现文档。我是说您可以使用 Microsoft 编写的用于解析地理的库,然后自己枚举它们以获得您的观点。在进行地理解析后暂停调试器中的一些测试代码并查看生成的对象。存在其他 wkt 解析库;无需自己动手 - 例如github.com/cschwarz/wkx-sharp
【解决方案2】:

没有正则表达式,我的方法是找到最后一个(和第一个)包围的文本,然后使用String.Split,的分隔符和一个空格 分割它。如果有多个空格,请删除空条目。

string example = @"MULTIPOLYGON(((107.067521 16.873693000000003,107.06849999999997 16.873613000000034)))";

int start = example.LastIndexOf('(');
int end = example.IndexOf(')');
string inside = example.Substring(start + 1, end - start - 1);
string[] fields = inside.Split(new char[] { ' ', ',' }, StringSplitOptions.RemoveEmptyEntries);

// Example
Console.WriteLine($"long1={fields[0]} lat1={fields[1]} long2={fields[2]} lat2={fields[3]}");

为了稍微更健壮,您可以先通过逗号分隔以获取用空格分隔的长纬度对,然后将这些字段拆分为空格。但是假设输入格式正确,上面的示例应该可以正常工作。

【讨论】:

  • 如果我的列表有多个,这不是很理想
  • 也许您可以提供一个示例来帮助我确定您的绩效预期?
  • 我截掉了一部分的字符串列表,实际列表链接notepab : link : anotepad.com/notes/sswrq7xd
  • 我不敢相信在这么小的数据集上性能会成为一个问题。但是您似乎可以安全地假设start14 并且endexample.Length - 3。如果您提供最终所需的数据格式,那么我可以提供更优化的代码。但即使解析为双精度,这:inside.Split(" ,".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).Select(double.Parse).ToArray(); 只需不到一毫秒。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-01
相关资源
最近更新 更多