Select 字符串列表的第一个单词和 linq 列表中其余项目的最后一个字符

Select first word of list of strings and concat last char of the rest of items on list in linq

python 代码如下:

reads = ['ACCGA', 'CCGAA', 'CGAAG', 'GAAGC', 'AAGCT']
k=len(reads[0])
rest = ""
for r in reads[1:]:
    rest += (r[k-1:])
print reads[0] + rest

代码获取列表中的第一个项目 ACCGA 然后连接列表其余部分中每个项目的最后一个字符,如

the rest = ['CCGAA', 'CGAAG', 'GAAGC', 'AAGCT']

并取'CCGAA', 'CGAAG', 'GAAGC ', 'AAGCT'

所以结果ACCGA+A+G+ C+T

result = ACCGAAGCT

使用 linq 的方法是什么?

我明白我们可以 select 第一项做

string result = myList.Select(arr => arr.FirstOrDefault());

然后连接其余部分

var rest = from p in myList.Items
                 where ....  
                select p;

不知道怎么完成

为什么需要 linq?

基本上你只需要一行python代码:

result = reads[0] + ''.join([item[-1] for item in reads[1:]])

这有帮助吗?

string[] reads = new string[] { "ACCGA", "CCGAA", "CGAAG", "GAAGC", "AAGCT" };
string firstword = reads[0];
reads.Where(r => !r.Equals(firstword)).ToList().ForEach(s => firstword = firstword + s.Last());

不确定你为什么要这样做,但这应该使用 string ctor 的重载来解决这个问题,除了 char[] :

string[] myList = {"ACCGA", "CCGAA", "CGAAG", "GAAGC", "AAGCT"};

string result = myList[0] + new String(myList.Where(s=> s != myList[0]).Select(s2=> s2.Last()).ToArray());

输出:ACCGAAGCT

new []{"ACCGA", "CCGAA", "CGAAG", "GAAGC", "AAGCT"}.Aggregate((a,b)=>a+b.Last())

对于非常大的数组,这会表现得更好:

var arr=new []{"ACCGA", "CCGAA", "CGAAG", "GAAGC", "AAGCT"};
var builder=new StringBuilder(arr.First());
var res=arr.Skip(1).Aggregate(builder,(a,b)=>a.Append(b.Last())).ToString();

对于非常大的列表或数组(任何实现本机 Count/Length 的 IEnumerable),这会稍微好一些,预分配 StringBuilder 的大小,随意删除 -1 浪费多一个字节的内存以换取少一个减量:

var arr=new []{"ACCGA", "CCGAA", "CGAAG", "GAAGC", "AAGCT"};
var builder=new StringBuilder(arr.First(),arr.First().Length+arr.Length-1);
var res=arr.Skip(1).Aggregate(builder,(a,b)=>a.Append(b.Last())).ToString();

这里有一个更快的版本,如果你真的需要额外的速度:

var arr=new []{"ACCGA", "CCGAA", "CGAAG", "GAAGC", "AAGCT"};
var builder=new StringBuilder(arr.First(),arr.First().Length+arr.Length-1);
var res=arr.Skip(1).Aggregate(builder,(a,b)=>a.Append(b[b.Length-1])).ToString();

更快:

var res=arr[0].Substring(0,arr[0].Length-1)+String.Join("",arr.Select(b=>b[b.Length-1]));

甚至更快:

var arr=Enumerable.Range(0,1000000).Select(x=>"ABCDEFGHIJKLMNOPQ").ToArray();
var len=arr.Length;
var builder=new StringBuilder(arr[0],arr[0].Length+len-1);
for(var x=1;x<len;x++)
{
  builder.Append(arr[x][arr[x].Length-1]);
}
var res=builder.ToString();