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']
并取'CCGA
A', 'CGAA
G', 'GAAG
C ', 'AAGC
T'
所以结果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();
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']
并取'CCGA
A', 'CGAA
G', 'GAAG
C ', 'AAGC
T'
所以结果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();