根据这个帖子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变量是真的?
答案 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
循环并迭代数组。