【问题标题】:how to know which boolean is true如何知道哪个布尔值是真的
【发布时间】:2013-07-10 13:21:04
【问题描述】:

据此贴Elegantly determine if more than one boolean is "true"

使用这部分代码...

public bool ExceedsThreshold(int threshold, IEnumerable<bool> bools)
{
   int trueCnt = 0;
   foreach(bool b in bools)
      if (b && (++trueCnt > threshold)) 
          ***//here i need to know which of b is the true***
          return true;
   return false;          
} 

我想知道哪个 bools 变量是真的?

【问题讨论】:

  • 我不确定我是否理解这个问题。当您说您想知道哪些布尔变量为真时,您是指索引(例如:索引 1、3 和 4 为真)吗?
  • which one is true 是什么意思。严格来说,IEnumerable 不保证顺序,所以检索真假值的索引是不对的。在我看来,您可以从IEnumerable&lt;bool&gt; 获得的唯一信息是对真值、假值和总值的计数,仅此而已。
  • 是的 Chrischu 和 quetzacotel 使用 ElementAt 或其他方法向我展示了一个真实的列表或单个元素
  • @KekuSemau 一个IEnumerable 肯定 订购的。什么会让你觉得它不是。
  • 这是拒绝对象的味道;你打算用索引做什么?在另一个列表中查找其他值?

标签: c# visual-studio-2010


【解决方案1】:

如果您想知道真值的索引,请使用包含索引参数的Select 的重载:

IList<int> indices = bools.Select((b, i) => new {Index = i, IsTrue = b})
                          .Where(x => x.IsTrue)
                          .Select(x => x.Index)
                          .ToList();

【讨论】:

    【解决方案2】:

    给定一个bool 列表,这将返回一个正确的索引列表

    var myList = new List<bool>{false, false, true, true, false};
    
    // Will return an IEnumerable containing {2, 3}:
    var trueStuff = myList.Select((value, pos) => pos).Where(pos => myList[pos]);
    

    更新:正如下面评论中所指出的,上述内容仅适用于 List,不适用于 IEnumerable。不过我还是把它留在这里,因为它可能在另一个类似的情况下很有用。

    另外,为了记录,这里有一个解决方案(尽管稍微不那么优雅),应该适用于任何一种情况:

    // Note: IEnumerable this time:
    IEnumerable<bool> myList = new List<bool> { false, false, true, true, false };
    
    var trueStuff = new List<int>();
    int pos = 0;
    foreach (var b in myList)
    {
        if(b){ trueStuff.Add(pos); }
        pos++;
    }
    

    【讨论】:

    • 我可以看到我目前有一张赞成票,一张反对票。没关系,但我会很感激评论解释后者的原因..
    • 输入是IEnumerable,而不是List。您不应该对IEnumerable 进行索引,因此这不是一个合适的解决方案。
    • 你说得对……Doh!我做了一些更改,感谢您的意见!
    【解决方案3】:

    我想知道哪个 bools 变量是真的?

    这个使用LINQ

    IList<bool> _result = bools.Where(x => x == true);
    

    【讨论】:

    • 这不是简单地给你一些trues 的列表吗?例如,true 元素的索引可能更有价值。
    • 是的!马格纳斯就是!如何获取真实元素的索引
    • @gregdorian 您首先在问题中包含这样的要求,而不是让人们尝试猜测您想要的结果。
    【解决方案4】:

    我不确定我的理解是否正确,但如果您想知道枚举列表中哪些 Boolean 值是 true 哪些是 false >,您可以将该例程修改为如下所示:

    public static string GetBoolString(IEnumerable<bool> bools) 
    {
      var boolArray = bools.ToArray();
      char[] data = new char[boolArray.Length];
      for (int i = 0; i < boolArray.Length; i++)
      {
        data[i] = boolArray[i] ? '1' : '0';
      }
      return new string(data);
    }
    

    请注意,我并没有提出任何“优雅”的解决方案;刚刚完成。

    【讨论】:

      【解决方案5】:
      var firsttrue = bools.First(b => b);
      

      【讨论】:

        【解决方案6】:

        如果您从 IEnumerable 切换到具有内置索引的对象(如数组或 List),则可以执行此操作,以返回正确的索引列表:

        public IEnumerable<int> GetTrueIndices(bool[] b)
        {
            return Enumerable.Range(0, b.Length).Where(i => b[i]);
        }
        

        如果有一个列表,它会是这样的:

        public IEnumerable<int> GetTrueIndices(List<bool> b)
        {
            return Enumerable.Range(0, b.Count).Where(i => b[i]);
        }
        

        【讨论】:

        • 您对IEnumerable 的实现(即OP 的情况)效率极低。您将序列迭代 N+1 次(一次就足够了)。那……*真的*糟糕。
        • 我确实说过它不是高性能的 - 我只包括了 IEnumerable 案例以供参考。因为(正如其他人指出的那样)IEnumerable 无论如何都不能保证真正的排序,我想说我的第一个建议可能是这个问题的最佳答案。
        • 然而情况很重要;另外两个不相关,因为它们不是 OP 正在处理的。此外,这不仅仅是性能问题。你不能依赖这样一个事实,即你将能够多次迭代任意序列,或者如果你这样做,它将具有相同的值。
        • 同样,对于IEnumerable 的两次迭代,您不能依赖相同的索引;不能保证当前投票最高的答案会返回任何有意义的。回答问题有时意味着纠正无效的假设。无论如何,我已经删除了IEnumerable 版本。
        • 如果调用两次就不一样了,但这并不意味着你不能有意义地使用它。该函数应该迭代它不超过一次,并且应该返回该一次迭代的索引。如果结果序列被迭代多次,它可能反映源序列的变化,或者多次迭代时它不同的事实。这不会使这种方法无效。这意味着您应该只迭代序列一次,这是不可能的。现在您的答案没有回答问题,因为您没有使用 OP 的输入。
        【解决方案7】:

        如果您想使用索引,请不要使用IEnumerable,而是使用数组。

        要获取索引,请使用 for 循环并遍历数组。

        【讨论】:

        • Linq 具有方法重载,可让您获取每个项目的索引。
        • 但是 OP 并没有要求 LINQ 解决方案,那么为什么不赞成使用独立于语言的普通方式呢?
        • @FelixC 因为你说它不能IEnumerable 完成,他需要使用for 循环。他没有。他肯定可以使用IEnumerable 做到这一点。他不需要我们LINQ,这是真的。如果您想展示一个非 LINQ 解决方案,那很好,但是说您必须IEnumerable 转换为数组是完全错误的。
        • 我从来没有说过不可能,我说他不应该使用它。 IEnumerable 不保证元素的正确顺序。
        • @FelixC 这完全是错误的。你这么说的依据是什么?
        猜你喜欢
        • 2016-01-01
        • 1970-01-01
        • 2019-01-25
        • 2011-07-30
        • 1970-01-01
        • 2014-12-05
        • 2020-12-31
        • 1970-01-01
        • 2021-11-14
        相关资源
        最近更新 更多