我们有一个输入字符串,其中有几个点分隔的值,每个单位都用空格分隔。 如果输入如下:
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或更简单的逻辑来解决这个问题?
答案 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));