有如下的python代码:
patterns = [s for s in"""
ATGCG
GCATG
CATGC
AGGCA
GGCAT
""".split() if s]
for i1, p1 in enumerate(patterns):
for i2, p2 in enumerate(patterns):
if p1[1:] == p2[:len(p2) - 1] and i1 != i2:
print (p1 + ' -> ' + p2)
并输出:
AGGCA -> GGCAT
CATGC -> ATGCG
GCATG -> CATGC
GGCAT -> GCATG
我想把它翻译成c#但是我坚持使用for循环,特别是on 如果p1 [1:] == p2 [:len(p2) - 1]和i1!= i2,则emule枚举(模式)有一个函数
public static void Each<T>( this IEnumerable<T> ie, Action<T, int> action )
{
var i = 0;
foreach ( var e in ie ) action( e, i++ );
}
patterns = "ATGCG\nGCATG\nCATGC\nAGGCA\nGGCAT";
var elems = patterns.Split(new[] { "\n" }, StringSplitOptions.RemoveEmptyEntries);
var strings = new List<string>();
strings.Each( ( elems , n ) =>
{
} );
如何完成代码?
答案 0 :(得分:1)
LINQ解决方案,使用SelectMany
获取商品对,使用Skip
/ Take
/ SequenceEqual
来比较string
部分:
var results = elems.SelectMany((p1, i1) => elems.Where((p2, i2) => i1 != i2).Select(p2 => new { p1, p2 }))
.Where(x => x.p1.Skip(1).SequenceEqual(x.p2.Take(x.p2.Length - 1)))
.ToList();
results
将是匿名类型对象的列表,具有两个字符串属性:p1
和p2
。您可以使用标准results
循环轻松迭代foreach
:
foreach(var pair in results)
{
Console.WriteLine("{0} -> {1}", pair.p1, pair.p2);
}
打印与你的python代码完全相同的东西。
使用Skip
和标准Take
等式检查,您可以在不SequenceEqual
/ string.Substring
/ string
的情况下实现相同目标。用以下内容替换解决方案的Where
部分:
.Where(x => x.p1.Substring(1) == x.p2.Substring(0, x.p2.Length - 1))