c# - 找出所有相同的答案

标签 c# arrays linq

我有一份人们对问卷的回答列表。答案目前是一个字符串数组,所以我的对象看起来像

 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"}
 };

我需要找到所有值都相同的那些数组索引和值。
结果对象可以是 string[]喜欢
 {"","A","","F","B"}

或某种类型的自定义对象元组,例如 {1,"A"}, {3, "F"}, {4, "B"}

我可以假设所有字符串数组的长度都相同。

我可以通过蛮力和循环来做到这一点,但我想知道是否有更有效的清洁方式,可能是通过 Linq。

这就引出了一个问题,Linq 是否只是在内部使用循环,而您节省的唯一效率是代码行和必须创建局部变量。

更新:
脱离 O. R. Mapper 和 Vajura
我在想两个循环

得到第一组答案,它给了我每个 string[] 的长度,并给了我答案应该是什么。即使第一个人是唯一回答 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

最佳答案

像这样的东西应该工作:

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

这是工作 fiddle

解释是:
  • 展平列表并选择每个字母并将其索引为匿名类型
  • 按字母和索引对对进行分组(匿名类型根据属性值进行比较,因此我们同时按字母和索引分组)
  • 这是棘手的部分,获取那些具有 answer.Count 的组许多项目,所以我们确保字母索引对存在于所有内部数组中,换句话说:一个字母出现在所有数组中的相同索引处。
  • 最后将这些组放入字典中,其中键是索引,值是字母。
  • 关于c# - 找出所有相同的答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26361185/

    相关文章:

    c# - 如何获得 HLSL 计算的输出?

    c# - C# 中的 SQLString

    c# - 如何获得我的 C# 项目之间的依赖关系图

    C#/C++ : How to visualize muli-dimensional arrays

    Javascript - 解析 XML 文档以创建数组

    javascript - 关于@symbol 对 JSON 键的影响

    c# - LINQ 读取 XML

    c# - 如何编写此 Linq to NHibernate 查询

    c# - 如何在我的可视化 C# 表单中使用 zxing.net

    c# - 如何使用按位运算符和枚举生成动态表达式?