找到所有相同的答案

Mik*_*ike 1 c# linq arrays

我列出了人们对调查问卷的答复.答案当前是一个字符串数组,所以我的对象看起来像

 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)

Sel*_*enç 6

这样的事情应该有效:

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

解释是:

  1. 展平列表并选择每个字母,并将其索引为匿名类型
  2. 按字母和索引对对分组(基于属性值比较匿名类型,因此我们同时按字母和索引分组)
  3. 这是一个棘手的部分,获得那些包含answer.Count许多项的组,因此我们确保所有内部数组中都存在字母索引对,换言之:所有数组中同一索引处都存在一个字母.
  4. 最后将组放入一个字典,其中Keys是索引,值是字母.