获取输出集合模拟

时间:2013-12-08 02:42:31

标签: c# python

有如下的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 ) =>
{

} );

如何完成代码?

1 个答案:

答案 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将是匿名类型对象的列表,具有两个字符串属性:p1p2。您可以使用标准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))