拆分输入字符串并形成逗号分隔输出

时间:2017-09-28 19:41:15

标签: c# linq

我们有一个输入字符串,其中有几个点分隔的值,每个单位都用空格分隔。 如果输入如下:

string input =“1.2 3.4 5.6 7.8 9”,我们需要打破它:

string beforeDots =“1,3,5,7,9”//点之前的所有整数。

字符串afterDots =“2,4,6,8”//点后的所有整数。

我们试过这个:

string inputSplit=input.Split(' ');
string beforeDots=string.Empty;
string afterDots=string.Empty;
foreach (string input in inputSplit)
{
   if (input.IndexOf(".") > 0)
      afterDots += "," + s.Split('.')[1];
   else
      beforeDots += "," + s;
}

if(afterDots.Length > 0)
   afterDots = afterDots.Substring(1, afterDots.Length - 1);

if(beforeDots.Length > 0)
   beforeDots = beforeDots.Substring(1, beforeDots.Length - 1);

有没有更好的方法可以通过linq或更简单的逻辑来解决这个问题?

6 个答案:

答案 0 :(得分:0)

你可以稍微清理一下你的逻辑:

function toggleExpandAll() {
    $.each(($("#mainTbl>tbody>tr:nth-child(even)").slice(0,50)), function(){
        (this.firstChild.firstChild).click();
        openItems(this.firstChild.firstChild.id, true);
    });
}

如果您需要将数字用于其他逻辑,这将为您提供单独保留数字(beforeDot,afterDot)的额外好处。

这里确实没有必要使用LINQ。

小提琴here

答案 1 :(得分:0)

我建议拆分字符串,然后使用linq。

编辑:我之前错过了数字之间的空格,下面更新的方法将考虑到空格。

string input = "1.2 3.4 5.6 7.8 9";
//split, assign index, flatten, group by index.
var inputGroups = input.Split(' ').Select(x => x.Split('.')).Select(x=>x.Select((number, i)=>new { Number = number, Index = i })).SelectMany(x=>x).GroupBy(x=>x.Index);
//group with index 0 was before the dot
var beforeDot= inputGroups.Where(grp=>grp.Key == 0) .FirstOrDefault().Select(x=>x.Number);
//group with key 1 was after the dot
var afterDot= inputGroups.Where(x=>x.Key == 1).FirstOrDefault().Select(x => x.Number);

//then use string.Join(",", str);
var commaSeparatedBefore = string.Join(",",beforeDot);
var commaSeparatedAfter = string.Join(",", afterDot);

答案 2 :(得分:0)

您可以使用极其简单且可维护的代码对任何T进行概括,而无需使用linq:

public static (IEnumerable<T> Prefixes, IEnumerable<T> suffixes)
    Separate<T>(this IEnumerable<T> source, T splitOn, T resetOn)
{
    if (source == null)
        throw new ArgumentNullException(nameof(source));

    var isSuffix = false;
    var prefixes = new List<T>();
    var suffixes = new List<T>();

    foreach (var c in source)
    {
        if (c.Equals(splitOn))
        {
            isSuffix = true;
        }
        else if (c.Equals(resetOn))
        {
            isSuffix = false;
        }
        else
        {
            if (isSuffix)
            {
                suffixes.Add(c);
            }
            else
            {
                prefixes.Add(c);
            }
        }
    }

    return (prefixes, suffixes);
}

用法非常简单:

var res = "1.2 3.4 5.6 7.8 9".Separate('.', ' ');

答案 3 :(得分:0)

输出是字符串(可以在事后解析):

class Program
{
    static void Main(string[] args)
    {
        var input = "1.2 3.4 5.6 7.8 9";

        var pairs = input.Split(' ').Select(
            s =>
            {
                var split = s.Split('.');

                return new KeyValuePair<string,string>(split[0],split.Length > 1 ? split[1] : null);
            });

        Console.WriteLine(String.Join(",", pairs.Select(p => p.Key)));
        Console.WriteLine(String.Join(",", pairs.Where(p=>p.Value != null).Select(p => p.Value)));

        Console.ReadKey();
    }
}

答案 4 :(得分:0)

你们,伙计们,这太复杂了。总而言之,这些只是十进制数。所以我会这样做:

static void Main(string[] args)
{
    var input = "1.2 3.4 5.6 7.8 9";
    var numbers = input.Split().Select(s => decimal.Parse(s));

    var beforeDots = numbers.Select(n => (int)Math.Truncate(n));
    var afterDots = numbers.Select(n => (int)((n - Math.Truncate(n)) * 10));

    Console.WriteLine(string.Join(",", beforeDots));
    Console.WriteLine(string.Join(",", afterDots));

    Console.ReadLine();
}

// Output:
// 1,3,5,7,9
// 2,4,6,8,0

答案 5 :(得分:-1)

你可以这样做:

var tmp = input.Split(' ').Select(x => x.Split('.'));
var beforeDots = string.Join(",", tmp.Select(x => x.First()));
var afterDots = string.Join(",", tmp.Select(x => x.ElementAtOrDefault(1)).Where(x => x != null));