【问题标题】:Filtering and splitting on position [closed]过滤和拆分位置[关闭]
【发布时间】:2013-03-28 15:00:12
【问题描述】:

所以我在创建一些共享代码时坚持我的项目。我有一个包含一些字符串的列表。我想过滤它,然后在位置上拆分过滤后的字符串。我已经在 Objective-c 中完成了这个,但我不知道如何在 c# 中做到这一点。

Objective-c 是这样的:

NSPredicate *findStringWithStatusPlanned = [NSPredicate predicateWithFormat:@"SELF contains[c] 'TOMTOM101'"];
        NSArray *filteredArrayOnStatusPlanned = [trackTraceContentFiltered filteredArrayUsingPredicate:findStringWithStatusPlanned];
        NSLog(@"%@",filteredArrayOnStatusPlanned);

        plannedStatusCompleet = [filteredArrayOnStatusPlanned lastObject];
            janssenRef = [plannedStatusCompleet substringWithRange:NSMakeRange(0, 8)];
            clientRef = [plannedStatusCompleet substringWithRange:NSMakeRange(9, 15)];
            dateReceived = [plannedStatusCompleet substringWithRange:NSMakeRange(25, 10)];
            tomTomCode = [plannedStatusCompleet substringWithRange:NSMakeRange(36, 9)];
            orderText = [plannedStatusCompleet substringWithRange:NSMakeRange(47, 59)];
            podFileName = [plannedStatusCompleet substringWithRange:NSMakeRange(113, 19)];
            Plannedidentifier = [plannedStatusCompleet substringWithRange:NSMakeRange(62, 1)];
            NSLog(@"Planid:%@",Plannedidentifier);

        NSArray *cutContentPlannedStatus = [NSArray arrayWithObjects:janssenRef,clientRef,dateReceived,tomTomCode,orderText,podFileName,Plannedidentifier,nil];
        [[NSUserDefaults standardUserDefaults] setObject:cutContentPlannedStatus forKey:@"plannedData"];

我尝试这样拆分:

foreach (string s in TrackTraceDataByLine) {
                string[] splitted = s.Split (new char[] { ' ' });
                if (s.Length >= referenceNumber.Length) {
                    if (referenceNumber == splitted [1]) {
                        dataFilteredOnRef.Add (s);
                    }
                }
            }

我可以很快意识到我必须按位置而不是按空格分割。这是因为某些部分(如参考编号)可能包含空格。

【问题讨论】:

    标签: c# ios linq xamarin


    【解决方案1】:

    你的意思是这样的?

    var janssenRef = sourceString.Substring(0, 8);
    var clientRef = sourceString.Substring(9, 15);
    var dateReceived = sourceString.Substring(25, 10);
    ...
    var array = new string[] { ... };
    

    要以 Linq 样式执行此操作,您可以使用锯齿状数组:

    var pos = new int[][] {
        new int[] { 0, 8 }, 
        new int[] { 9, 15 }, 
        new int[] { 25, 10 }, ... };
    var array = pos.Select(p => sourceString.Substring(p[0], p[1]))
                   .ToArray();
    

    或多维数组:

    var pos = new int[,] { { 0, 8 }, { 9, 15 }, { 25, 10 }, ... };
    var array = Enumerable.Range(0, pos.GetLength(0))
                          .Select(i => inputString.Substring(pos[i,0], pos[i,1]))
                          .ToArray();
    

    【讨论】:

    • 明天要试试这个,但看起来不错!:)。
    • { 0, 3 } 应该是 { 0, 8 } 但很好的解决方案!
    • 错误 CS0623:数组初始化器只能用于变量或字段初始化器。尝试改用新表达式 (CS0623) (TrackandTrace.IOS)
    • @user1805901 C# 似乎不支持锯齿状数组初始化。我已经更新了我的答案。
    猜你喜欢
    • 2015-01-23
    • 1970-01-01
    • 1970-01-01
    • 2014-08-31
    • 2019-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多