我希望避免循环。
我有这个:
string s = "AAAA,12,BBBB,34,CCCCC,56";
使用Linq,我想要有两个列表
第一个列表包括: AAAA,BBBB和CCCCC
第二个列表包括:12、34和56
不基于数字或非数字。
谢谢,
我希望避免循环。
我有这个:
string s = "AAAA,12,BBBB,34,CCCCC,56";
使用Linq,我想要有两个列表
第一个列表包括: AAAA,BBBB和CCCCC
第二个列表包括:12、34和56
不基于数字或非数字。
谢谢,
你可以使用
var str = "AAAA,12,BBBB,34,CCCCC,56";
var spl = str.Split(',');
var l1 = spl.Where((x, y) => y % 2 == 0).ToList();
var l2 = spl.Where((x, y) => y % 2 == 1).ToList();
这将检查索引是否为偶数或奇数。
让我们使用Aggregate
来玩一下(同时也证明这可以作为一个单一的表达式完成):
"AAAA,12,BBBB,34,CCCC,56".Split(',').Aggregate(
new { Uneven = new List<string>(), Even = new List<string>() },
(seed, s) => {
if (seed.Uneven.Count > seed.Even.Count)
seed.Even.Add(s);
else
seed.Uneven.Add(s);
return seed;
});
根据LINQPad,结果如下所示:
当然,我可能不会这样做,因为它很难阅读。而且测试哪个列表要添加到,嗯,不太好。
但至少我们现在有了另一个lambda语句的例子 - 通常LINQ的文献会试图忘记它们(可能是因为它们不能与使用表达式树的SQL或任何其他后端一起工作)。
与上面更干净的解决方案相比,此方法的优点是只对列表进行一次遍历。但由于我们正在拆分字符串,因此我会尝试在其他地方进行优化;) 一个IEnumerable<string> Split(this string self, string boundary)
会很酷吧?
TSource
(未修改)还是TAccumulate
(已修改,但这不总是这种情况吗?)? - Daren ThomasAggregate
就可以发挥作用(特别是因为您可以添加第三个参数以返回/格式化最终结果)。 - Daren ThomasTAccumulate
。我认为它不应被修改。例如,如果我使用Aggregate计算一组数字的和或积,则聚合函数应该只返回其参数的乘积或总和,而不改变其中任何一个数。在这种情况下,“函数式”解决方案(例如,如果您使用Haskell或* ML编写它)可能会在链接列表上工作,并创建一个具有廉价的“Cons”指令的新链接列表,而不是修改其参数。 (在我看来,Linq应该包括一种链接列表类型,可以让您做到这一点。) - Niki假设规则是将一个列表中的每个第二个字符串放入一个列表中,其他字符串放入另一个列表中,则可以按照以下方式操作:
string s = "AAAA,12,BBBB,34,CCCCC,56";
var parts = s.Split(',');
var first = parts.Where((p, i) => i % 2 == 0);
var second = parts.Where((p, i) => i % 2 == 1);
我不确定你的最终目标是什么,但你可以尝试这样做:
var strings = s.Split(',').Where( (s,p) => p % 2 == 0)
这里是针对那些感兴趣的人的isnumeric和not numeric过滤器...我意识到它并不是必需的
string x = "AAAA,12,BBBB,34,CCCCC,56";
Regex _isNumber = new Regex(@"^\d+$");
string[] y = x.Split(',') .Where(a => _isNumber.IsMatch(a)).ToArray();
string[] z =x.Split(',') .Where(a => !_isNumber.IsMatch(a)).ToArray();
public IEnumerable<IEnumerable<T>> ToLists<T>(IEnumerable<T> sequence)
{
var res = sequence.Select((item, position) => new { Item = item, Position = position })
.GroupBy(pair => pair.Position % 2 == 0,pair => pair.Item);
return from grouping in res
select grouping;
}
非常有趣,没有副作用和无需方法调用。
"TesteDessaBudega".Aggregate(new List<List<char>>(),
(l, c) => char.IsUpper(c) ?
l.Union(
new List<List<char>>(){
new List<char>(){c}
}
).ToList() :
l.Take(l.Count - 1).Union(
new List<List<char>>(){
l.Last().Union(
new List<char>(){c}
).ToList()
}
).ToList()
)
哦,只是为了更有趣在VB.NET上。
"TesteDessaBudega".Aggregate(New List(Of List(Of Char))(),
Function(l, c) If(Char.IsUpper(c),
l.Union(
New List(Of List(Of Char))(New List(Of Char)(){
New List(Of Char)(New Char(){c})
})
).ToList(),
l.Take(l.Count - 1).Union(
New List(Of List(Of Char))(New List(Of Char)(){
l.Last().Union(
New List(Of Char)(New Char(){c})
).ToList()
})
).ToList()
))
var stringList = "AAAA,12,BBBB,34,CCCCC,56".Split(',');
var intsAsStrings = stringList.Where(
(x) =>
{
int i;
return int.TryParse(x, out i);
}).ToList();
var strings = stringList.Where(x => !intsAsStrings.Contains(x)).ToList();