2012-09-07 30 views
23

Tôi đã viết một mã trong AS3 cho phép tôi để kiểm tra xem một số cụ thể của mọi thứ thật ...boolean thêm (như số nguyên)

If (true + false + true + true + false + true + true < 4) 
{ 

} 

Khi tôi đã cố gắng viết lại bằng C#, nó nói với tôi tôi có thể không thêm loại bool và bool. Cách tốt nhất để làm điều này để viết lại nó như thế này? Hoặc là có một số công việc đơn giản xung quanh?

If ((true?1:0) + (false?1:0) + (true?1:0) + (true?1:0) + (false?1:0) + (true?1:0) + (true?1:0) < 4) 
{ 

} 
+2

'public int ToInt (bool b) {return b? 1: 0;} ' –

+0

@ L.B:' ToInt' tồn tại dưới dạng 'Convert.ToInt32' – porges

+0

http: // stackoverflow.com/questions/377990/thanh lịch-xác định-nếu-nhiều hơn một-boolean-là-đúng –

Trả lời

47

Hãy thử sử dụng IEnumerable<T>.Count(Func<T,bool>) từ System.Linq, với T như bool, trên một params tham số phương thức.

public static int CountTrue(params bool[] args) 
{ 
    return args.Count(t => t); 
} 

Cách sử dụng

// The count will be 3 
int count = CountTrue(false, true, false, true, true); 

Bạn cũng có thể giới thiệu một phương pháp this mở rộng:

public static int TrueCount(this bool[] array) 
{ 
    return array.Count(t => t); 
} 

Cách sử dụng

// The count will be 3 
int count = new bool[] { false, true, false, true, true }.TrueCount(); 
+1

Đẹp nhất! Mã rất sạch sẽ và thanh lịch! – Mithrandir

+1

Thật đẹp: ') Cảm ơn, đây chỉ là những gì tôi sẽ sử dụng! – Randomman159

+3

+1 Vâng, ý tưởng hay bằng cách sử dụng 'params' – sloth

13

Bạn có thể tạo một mảng và sử dụng Count:

if ((new []{true, false, true, true, false, true, true}).Count(x=>x) < 4) 
{ 

} 

hoặc Sum phương pháp:

if ((new []{true, false, true, true, false, true, true}).Sum(x=>x?1:0) < 4) 
{ 

} 
+0

Nếu tôi đã sử dụng nó như một một off, đây là cách tôi muốn làm điều đó, nhờ đống để trả lời * upvotes * – Randomman159

+0

Cảm ơn! Đây là cách tiếp cận yêu thích của tôi. Tôi đã có một vài bools tôi cần phải thêm như thế này, và (new [] {var1, var2, var3, var4}) Sum (x => x? 1: 0); làm việc tuyệt vời cho tôi! – statue

1

Convert.ToInt32(true) + Convert.ToInt32(false) + Convert.ToInt32(true) cũng làm việc trong trường hợp này tôi nghĩ rằng đây là cách đơn giản nhất chúng ta có

+0

những gì bạn tink về nó –

11

Dưới đây là một ví dụ vui hơn:

if ((BoolCount)true + false + true + true + false + true + true <= 5) 
{ 
    Console.WriteLine("yay"); 
} 

Sử dụng lớp này:

struct BoolCount 
{ 
    private readonly int c; 
    private BoolCount(int c) { this.c = c; } 

    public static implicit operator BoolCount(bool b) 
     { return new BoolCount(Convert.ToInt32(b)); } 

    public static implicit operator int(BoolCount me) 
     { return me.c; } 

    public static BoolCount operator +(BoolCount me, BoolCount other) 
     { return new BoolCount(me.c + other.c); } 
} 
+1

Ha! Hoàn toàn vui vẻ, thực sự! +1 – sloth

0

(Lấy cảm hứng từ LB : s nhận xét) bạn có thể viết một phương pháp mở rộng:

static class Ex 
{ 
    public static int Int(this bool x) { return x ? 1 : 0; } 
} 

Và sau đó (với điều kiện bạn bao gồm một using đến không gian tên có chứa các lớp Ex), bạn có thể viết câu if của bạn như thế này:

if (true.Int() + false.Int() + true.Int() + true.Int() + 
    false.Int() + true.Int() + true.Int() < 4) 
{ 
    ... 
} 
0

Bạn có thể viết một phương pháp mở rộng cho lớp BitArray. Tôi không chắc chắn nếu thực hiện sẽ được bất kỳ tốt hơn so với sử dụng LINQ, nhưng ít nhất một lựa chọn của mình:

public static int CountSetBits(this BitArray theBitArray) 
{ 
    int count = 0; 
    for (int i = 0; i < theBitArray.Count; i++) 
    { 
     count += (theBitArray.Get(i)) ? 1 : 0; 
    } 
    return count; 
} 

Cách sử dụng:

BitArray barray = new BitArray(new [] { true, true, false, true }); 
int count = barray.CountSetBits(); // Will return 3 
Các vấn đề liên quan