Kmers-如何连接序列并将子字符串放入数组

时间:2019-04-07 05:10:48

标签: c#

我目前正在尝试找到一种方法来实现一个小的生物信息库,以用于DNA序列的操作。这些表示为仅包含字符A,C,G和T的字符串。如何使此方法采用以下参数?

  1. 一个整数,指定K
  2. 任意数量的DNA序列,每个序列作为单独的论据提供

我需要使它加入这些序列,并将每个序列放入自己的数组中。

到目前为止,我已经创建了两个方法:Main()和Kmers()。我这样做了,所以Kmer方法会将一个字符串(例如“ AGATCGAGTG”)分解为3个字符,例如:

AGAGATATCTCGCGAGAGAGATGTGTG

然后,我的Main()方法显示以下值:

using System;

class Sequence
{

    public static void Main(string[] args)
    {
        foreach (string kmerArray in Kmers(3, "GCATACGAT"))
        {
            Console.Write(kmerArray);
        }
        Console.ReadLine();
    }

    public static Array Kmers(int k, params string[] x)
    {
        int ArraySize = x.Length;
        string[] kmer = new string[ArraySize];

        for (int i = 0; i < ArraySize - k + 1; i++)
        {
            if (i <= ArraySize)
            {
                kmer[i] = x.Substring(i, k);
            }
        }

        return kmer;
    }
}

我的输出应如下所示:

AGA,GAT,ATC,TCG,CGA,GAG,AGT,GTG

3 个答案:

答案 0 :(得分:3)

x必须是string而不是string[]

public static IEnumerable<string> Kmers(int k, string x)
{
    for (int i = 0; i < x.Length - k + 1; i++)
        yield return x.Substring(i, k);
}

string[] result = Kmers(3, "GCATACGAT").ToArray(); 

如果您需要用逗号分隔的字符串:

 string result = string.Join(",", Kmers(3, "GCATACGAT"));

仅使用System命名空间即可:

public static string[] Kmers(int k, string x)
{
    string[] result = new string[x.Length - k + 1];
    for (int i = 0; i < x.Length - k + 1; i++)
        result[i] = x.Substring(i, k);
    return result;
}

Live Demo

编辑(考虑评论):

如果希望将字符串数组作为参数,并且应返回以逗号分隔的字符串数组,则Kmers函数应如下所示:

public static string[] Kmers(int k, string[] x)
{
    string[] result = new string[x.Length];
    for (int j = 0; j < x.Length; j++)
    {
         string[] itemresult = new string[x[j].Length - k + 1];
         for (int i = 0; i < x[j].Length - k + 1; i++)
              itemresult[i] = x[j].Substring(i, k);
         result[j] = string.Join(",", itemresult);
     }
     return result;
}

,并且您还应该将string[]传递给它:

string[] input = {"GCATACGAT", "GACGAT", "ACGATCATA"};
string[] result = Kmers(3, input);

foreach (string x in result)
   Console.WriteLine(x);

结果:

  

GCA,CAT,ATA,TAC,ACG,CGA,GAT

     

GAC,ACG,CGA,GAT

     

ACG,CGA,GAT,ATC,TCA,CAT,ATA

答案 1 :(得分:1)

这是一个解决方案:

string input = "AGATCGAGTG";
int k = 3;
var result = Enumerable.Range(0, input.Length - k + 1).Select(x => input.Substring(x, k));

输出结果:

AGA
GAT
ATC
TCG
CGA
GAG
AGT
GTG

如果要使用逗号联接:请使用“,”进行联接

string r = string.Join(",", result);

答案 2 :(得分:0)

使用LINQ

    IEnumerable<string> Substrings(string str, int size)
    {
        return Enumerable.Range(0, str.Length - size + 1)
            .Select(i => str.Substring(i, size));
    }

    Console.Write(string.Join(",", Substrings("GCATACGAT", 3).ToList()));

输出

GCA,CAT,ATA,TAC,ACG,CGA,GAT