-1

根据这个线程优雅地确定是否有多个布尔值是“真”

使用这部分代码...

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 变量是真的?

4

7 回答 7

7

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

IList<int> indices = bools.Select((b, i) => new {Index = i, IsTrue = b})
                          .Where(x => x.IsTrue)
                          .Select(x => x.Index)
                          .ToList();
于 2013-07-10T13:30:08.913 回答
2

给定一个 的列表bool,这将返回一个为 true 的索引列表

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

更新:正如下面评论中所指出的,上述内容仅适用于列表,不适用于 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++;
}
于 2013-07-10T13:47:51.560 回答
1

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

这个使用LINQ

IList<bool> _result = bools.Where(x => x == true);
于 2013-07-10T13:23:13.743 回答
1

我不确定我是否理解正确,但是如果您想知道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);
}

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

于 2013-07-10T13:50:55.167 回答
-1
var firsttrue = bools.First(b => b);
于 2013-07-10T13:42:06.563 回答
-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]);
}
于 2013-07-10T13:41:56.260 回答
-2

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

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

于 2013-07-10T13:39:50.517 回答