我列出了人们对调查问卷的答复.答案当前是一个字符串数组,所以我的对象看起来像
List<string[]> answers = new List<string[]>()
{ new string[]{"T","A","T","F","B"},
new string[]{"F","A","T","F","B"},
new string[]{"T","A","F","F","B"}
};
Run Code Online (Sandbox Code Playgroud)
我需要找到所有值相同的数组索引和值.将得到的对象可以是 string[]像
{"","A","","F","B"}
Run Code Online (Sandbox Code Playgroud)
或某种类型的自定义对象元组,如{1,"A"},{3,"F"},{4,"B"}
我可以假设所有字符串数组的长度都相同.
我可以通过蛮力和循环来做到这一点,但我想知道是否有更有效的清洁方式,可能通过Linq.
这就引出了一个问题,Linq是否只是在内部使用循环,而且保存的唯一效率是代码行并且必须创建局部变量.
更新: 关于OR Mapper和Vajura我想到的两个循环
得到第一组答案,它给出了每个字符串[]的长度,并给出了答案应该是什么.即使第一个人是唯一一个回答A的人,那么所有其他非A将自动取消该指数的资格
for each index in string[]
answer = List[0][index]
for i=1 to List.Count - 1
compare answer to List[i][index]
if false exit loop
if we made it through it is good
Run Code Online (Sandbox Code Playgroud)
这样的事情应该有效:
answers
.SelectMany(x => x.Select((y, idx) => new { c = y, index = idx })) // 1
.GroupBy(x => x) // 2
.Where(x => x.Count() == answers.Count) // 3
.ToDictionary(x => x.Key.index, x => x.Key.c); // 4
Run Code Online (Sandbox Code Playgroud)
这是工作 fiddle
解释是:
answer.Count许多项的组,因此我们确保所有内部数组中都存在字母索引对,换言之:所有数组中同一索引处都存在一个字母.