获取输出采集模拟

2024-04-23 10:10:08 发布

您现在位置: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#但是我被困在循环和特别是 如果p1[1:]==p2[:len(p2)-1]和i1!=i2,要枚举(模式)有一个函数

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 ) =>
{

} );

如何完成代码?你知道吗


Tags: 代码inforifvarpatternsp2p1
1条回答
网友
1楼 · 发布于 2024-04-23 10:10:08

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。您可以使用标准的foreach循环轻松地迭代results

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))

相关问题 更多 >