【发布时间】:2014-10-14 21:46:08
【问题描述】:
我有一份人们对问卷的回答的列表。答案目前是一个字符串数组,所以我的对象看起来像
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 我在想两个循环
得到第一组答案,它给出了每个字符串[] 的长度,并给出了答案应该是什么。即使第一个人是唯一回答 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
【问题讨论】:
-
Linq 是 语法糖,当编译成 IL 时会在底层使用循环等。
-
使用 loops 并不意味着使用 brute force。而且,是的,LINQ 只是在内部使用循环,因此与正确编写的循环相比,执行效率没有固有的增益。
-
对于这个解决方案,除了“蛮力”之外别无他法。您需要检查每个值。话虽如此,您可以对其进行很多优化,可以说第二个字符串数组的第一个索引已经不同,然后第一个索引就不再需要检查任何后续数组的值了。可能还有其他一些小事情可以优化它。
-
@Vajura 给出了两种不同的 Linq 方法,所以我不会说“蛮力”是唯一的方法。这可能是最好的方式,但肯定不是唯一的方式。