如何知道哪个布尔值为真

时间:2013-07-10 13:21:04

标签: c# visual-studio-2010

根据这个帖子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变量是真的?

7 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分: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++;
}

答案 2 :(得分:1)

  

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

这个使用LINQ

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

答案 3 :(得分:1)

我不确定我是否正确理解了这一点,但是如果您想知道枚举列表中哪些Boolean true 哪些值 false < / strong>,你可以修改那个例程:

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

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

答案 4 :(得分:-1)

如果从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]);
}

答案 5 :(得分:-1)

var firsttrue = bools.First(b => b);

答案 6 :(得分:-2)

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

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