如何比较从文件加载的数组与从另一个文件加载的另一个数组c#

时间:2013-11-11 07:43:12

标签: c# arrays file split compare

我必须在C#Form中执行一个程序,该程序必须从一个看起来像这样的文件加载:

100ACTGGCTTACACTAATCAAG

101TTAAGGCACAGAAGTTTCCA

102ATGGTATAAACCAGAAGTCT

...

120GCATCAGTACGTACCCGTAC

20行,数字(ID)和20个字母(ADN);另一个文件看起来像这样:

TGCAACGTGTACTATGGACC

简而言之,这是一场谋杀案的游戏,有20人;我必须加载和分割字母和..我必须比较它们,最后我必须找到最佳匹配。 我不知道怎么做,我不知道如何加载数组中的字母然后拆分它们然后比较它们。

2 个答案:

答案 0 :(得分:0)

这是简单 match function。它可能不是你的游戏所需的复杂性。此解决方案不需要在字符串上显式split以获取DNA“字母”数组。比较DNA in place

将每个“可疑”条目与“证据一”进行比较。

int idLength = 3;
string evidence = //read from file
List<string> suspects = //read from file
List<double> matchScores = new List<double>();

foreach (string suspect in suspects)
{
    int count = 0;
    for (int i = idLength; i < suspect.Length; i++)
    {
        if (suspect[i + idLength] == evidence[i]) count++;
    }
    matchScores.Add(count * 100 / evidence.Length);
}

matchScores列表现在包含所有个人匹配分数。我没有将最大匹配分数保存在单独的变量中,因为可能有几个具有相同分数的“嫌疑人”。要找出哪个主题匹配最佳,只需迭代matchScores列表即可。最佳匹配的索引是suspects列表中嫌疑人的索引。

优化说明:

  • 你可以检查每个“可疑”字符串,看看DNA序列的起始位置(即在什么索引处),因为它可能是变量;
  • 这里可以使用字典而不是两个列表,其中“可疑字符串”为关键字,匹配分数为值

答案 1 :(得分:0)

你想在这里做的是使用类似字符串之间Levenshtein distance的计算。

简单来说,它提供了一个字母计数,你必须为一个字符串改变多少单个字母才能与另一个字母相等。在DNA或蛋白质的背景下,这可以解释为代表两个个体或样品之间的突变的数量。因此,较短的距离将表明两者之间的更紧密的关系。

算法在计算上可能相当繁重,但会给你一个很好的答案。实施起来也非常有趣和启发。您可以在wikipedia article下找到几种实现方法。

如果你发现它很难理解它是如何工作的,我建议你手工设置一个示例网格,一个沿着顶部水平放置一个短字符串,另一个沿着左边垂直放置,并尝试手动完成计算,只是为了正确理解这个概念(一开始可能会让人感到困惑,但实际上并不那么困难)。