0

我有一个包含整数或字符串整数的列表,如下所示

   TagNo      FTerminal
    1000         1
    1000         5
    1000         2S6

我怎样才能得到这样的结果

   TagNo      FTerminal
    1000         1
                 5
                 6

我有这个,但肯定会在 2s6 上给我错误。我怎样才能将其更改为涵盖所有内容?

 var terminalList = sourceLists.Where(t => t.TagNo == tagList)
                               .Where(t=>t.FromTerminal.Length>0)
                               .Select(t => int.Parse(t.FromTerminal))
                               .OrderBy(t=>t)
                               .ToList();
4

6 回答 6

1

Instead of using int.Parse in your LINQ statement, you need to write your own function.

Something like this:

int parseTerminal(string input) {
    int result = -1;
    if (!int.TryParse(input, out result)) {
        result = -99;
    }
    return result;
}

That would make your LINQ to

var terminalList = sourceLists
               .Where( t => t.TagNo == tagList && t.FromTerminal.Length > 0 )
               .Select( t => parseTerminak(t.FromTerminal) )
               .OrderBy( t=>t )
               .ToList();

Result:

TagNo      FTerminal
1000       -99
           1
           5

You need to handle the special case where FromTerminal is not a number yourself.

A naive implementation of the requirement one could think of is something like this:

int parseTerminal(string input) {
    int result = -1;
    if (!int.TryParse(input, out result)) {
        var temporaryString = string.Empty;
        var lastInt = -1;

        input.ToList().ForEach( aChar => {
            if ( aChar >= '0' && aChar <= '9' ) {
                temporaryString += aChar;
            }  else {
                if ( temporaryString.Length >= 0 ) {
                    int.TryParse( temporaryString, out lastInt );
                    temporaryString = string.Empty;
                }
            }
        } );
        if ( temporaryString.Length >= 0 ) {
            if (!int.TryParse( temporaryString, out lastInt )) {
                lastInt = -98;
            }
        }
        result = lastInt;
    }
    return result;
}

Note: I would not consider this production ready and you should think about edge cases.

于 2013-11-12T05:27:23.700 回答
0

如果最后一个符号总是 int 你可以像这样改变你的代码

var terminalList = sourceLists.Where(t => t.TagNo == tagList)
                           .Where(t=>t.FromTerminal.Length>0)
                           .Select(t => int.Parse(t.FromTerminal.Last()))
                           .OrderBy(t=>t)
                           .ToList();

更新
如果最后不仅是一个可以像这样使用正则表达式的数字

var terminalList = sourceLists.Where(t => t.TagNo == tagList)
                           .Where(t=>t.FromTerminal.Length>0)
                           .Select(t => int.Parse(Regex.Match(t.FromTerminal, @"(\d+)$").Groups[1].Value))
                           .OrderBy(t=>t)
                           .ToList();
于 2013-11-12T05:47:45.087 回答
0

嗯...而不是跳过箍,只需使用 IsInt ...问题已解决... :)

var terminalList = sourceLists.Where(t => t.TagNo == tagList)
                           .Where(t=>t.FromTerminal.Length>0)
                           .Where(t => t.FromTerminal.IsInt() )
                           .Select(t => int.Parse(t.FromTerminal))
                           .OrderBy(t=>t)
                           .ToList();

(因此,只需将此条件添加.Where(t => t.FromTerminal.IsInt() )到您的选择过程中)

于 2013-11-12T06:53:14.310 回答
0

在不了解您的数据结构的情况下,我使用某些系统类型编写了代码。

var tuples = new List<Tuple<int, string>>
                 {
                     new Tuple<int, string>(1000, "1"),
                     new Tuple<int, string>(1000, "5"),
                     new Tuple<int, string>(1000,"2s6")
                 };
var enumerable = tuples.GroupBy(t => t.Item1).
    Select(g => new Tuple<int, List<int>>(g.Key, g.Select(e => int.Parse(Regex.Match(e.Item2, @"(?<=(\D|^))\d+(?=\D*$)").Value)).ToList()));
于 2013-11-12T05:38:44.657 回答
0

发生错误是因为您尝试将字符串'2S6' 处理为整数,使用int.Parse. 这自然会导致异常。

我建议采用另一种方法,使用正则表达式。我认为正则表达式是更好的解决方案,因为您询问的数据是在对已检索到的查询结果进行字符串操作之后出现的。

用正则表达式来做这种工作人员,也方便你以后维护。想想这种情况,在一周内您不想检索字符串的最后一位,而是检索字符串的第二位。

您可以使用此在线正则表达式测试器来测试您的正则表达式。我想正则表达式\d(?!.*\d)将是一个不错的选择,因为它返回最后一个数字。

本文是在 .NET 中使用正则表达式的良好指南,包括示例。

希望我有所帮助!

于 2013-11-12T05:58:47.270 回答
0

我很困惑你想要什么......因为你的图片说你想要TagNOFTerminal的组合,另一方面你的查询说你只想要特定顺序的 FTerminals ..

现在如果你想要第一个

void Abc(int tagList)
{
    var sourceLists = new List<Demo>
    {
        new Demo { FTerminal = "200", TagNo = 1000 },
        new Demo { FTerminal = "300", TagNo = 1000 },
        new Demo { FTerminal = "400", TagNo = 1000 }
    };

    var terminalList = sourceLists
        .Where(t => t.TagNo == tagList && t.FTerminal.Length > 0)
        .OrderBy(i=>i.FTerminal).GroupBy(i=>i.TagNo);                                                               
}

第二个

void Abc(int tagList)
{

    var sourceLists = new List<Demo>
        {
          new Demo { FTerminal = "200", TagNo = 1000 },
          new Demo { FTerminal = "300", TagNo = 1000 },
          new Demo { FTerminal = "400", TagNo = 1000 }
        };

    var terminalList = 
        from Demo d in sourceLists
            where d.TagNo == tagList
            let number = int.Parse(d.FTerminal)
            orderby number ascending
            select number).ToList();
}

但是,如果您没有得到想要的答案,请敲门!!!!

于 2013-11-12T06:19:27.597 回答