Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ BinarySearch() [2/4]

static int System.Array.BinarySearch ( Array array,
int index,
int length,
object? value,
IComparer? comparer )
inlinestatic

Definition at line 1343 of file Array.cs.

1344 {
1345 if (array == null)
1346 {
1347 ThrowHelper.ThrowArgumentNullException(ExceptionArgument.array);
1348 }
1349 int lowerBound = array.GetLowerBound(0);
1350 if (index < lowerBound)
1351 {
1352 ThrowHelper.ThrowIndexArgumentOutOfRange_NeedNonNegNumException();
1353 }
1354 if (length < 0)
1355 {
1356 ThrowHelper.ThrowLengthArgumentOutOfRange_ArgumentOutOfRange_NeedNonNegNum();
1357 }
1358 if (array.Length - (index - lowerBound) < length)
1359 {
1360 ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_InvalidOffLen);
1361 }
1362 if (array.Rank != 1)
1363 {
1364 ThrowHelper.ThrowRankException(ExceptionResource.Rank_MultiDimNotSupported);
1365 }
1366 if (comparer == null)
1367 {
1369 }
1370 int num = index;
1371 int num2 = index + length - 1;
1372 if (array is object[] array2)
1373 {
1374 while (num <= num2)
1375 {
1376 int median = GetMedian(num, num2);
1377 int num3;
1378 try
1379 {
1380 num3 = comparer.Compare(array2[median], value);
1381 }
1382 catch (Exception e)
1383 {
1384 ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_IComparerFailed, e);
1385 return 0;
1386 }
1387 if (num3 == 0)
1388 {
1389 return median;
1390 }
1391 if (num3 < 0)
1392 {
1393 num = median + 1;
1394 }
1395 else
1396 {
1397 num2 = median - 1;
1398 }
1399 }
1400 return ~num;
1401 }
1402 if (comparer == Comparer.Default)
1403 {
1404 CorElementType corElementTypeOfElementType = array.GetCorElementTypeOfElementType();
1405 if (corElementTypeOfElementType.IsPrimitiveType())
1406 {
1407 if (value == null)
1408 {
1409 return ~index;
1410 }
1411 if (array.IsValueOfElementType(value))
1412 {
1414 int num4 = -1;
1416 {
1417 case CorElementType.ELEMENT_TYPE_I1:
1419 break;
1420 case CorElementType.ELEMENT_TYPE_BOOLEAN:
1421 case CorElementType.ELEMENT_TYPE_U1:
1423 break;
1424 case CorElementType.ELEMENT_TYPE_I2:
1426 break;
1427 case CorElementType.ELEMENT_TYPE_CHAR:
1428 case CorElementType.ELEMENT_TYPE_U2:
1430 break;
1431 case CorElementType.ELEMENT_TYPE_I4:
1433 break;
1434 case CorElementType.ELEMENT_TYPE_U4:
1436 break;
1437 case CorElementType.ELEMENT_TYPE_I8:
1438 case CorElementType.ELEMENT_TYPE_I:
1440 break;
1441 case CorElementType.ELEMENT_TYPE_U8:
1442 case CorElementType.ELEMENT_TYPE_U:
1444 break;
1445 case CorElementType.ELEMENT_TYPE_R4:
1447 break;
1448 case CorElementType.ELEMENT_TYPE_R8:
1450 break;
1451 }
1452 if (num4 < 0)
1453 {
1454 return ~(index + ~num4);
1455 }
1456 return index + num4;
1457 }
1458 }
1459 }
1460 while (num <= num2)
1461 {
1462 int median2 = GetMedian(num, num2);
1463 int num5;
1464 try
1465 {
1466 num5 = comparer.Compare(array.GetValue(median2), value);
1467 }
1468 catch (Exception e2)
1469 {
1470 ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_IComparerFailed, e2);
1471 return 0;
1472 }
1473 if (num5 == 0)
1474 {
1475 return median2;
1476 }
1477 if (num5 < 0)
1478 {
1479 num = median2 + 1;
1480 }
1481 else
1482 {
1483 num2 = median2 - 1;
1484 }
1485 }
1486 return ~num;
1487 static int GenericBinarySearch<T>(Array array, int adjustedIndex, int length, object value) where T : struct, IComparable<T>
1488 {
1489 return UnsafeArrayAsSpan<T>(array, adjustedIndex, length).BinarySearch(Unsafe.As<byte, T>(ref value.GetRawData()));
1490 }
1491 }
static Span< T > UnsafeArrayAsSpan< T >(Array array, int adjustedIndex, int length)
Definition Array.cs:2624
static int GetMedian(int low, int hi)
Definition Array.cs:1202
static Comparer< T > Default
Definition Comparer.cs:11

References System.array, System.comparer, System.Collections.Generic.Comparer< T >.Default, System.Array.GetMedian(), System.index, System.length, System.T, System.ThrowHelper.ThrowArgumentException(), System.ThrowHelper.ThrowArgumentNullException(), System.ThrowHelper.ThrowIndexArgumentOutOfRange_NeedNonNegNumException(), System.ThrowHelper.ThrowInvalidOperationException(), System.ThrowHelper.ThrowLengthArgumentOutOfRange_ArgumentOutOfRange_NeedNonNegNum(), System.ThrowHelper.ThrowRankException(), System.Array.UnsafeArrayAsSpan< T >(), and System.value.