Complex process of making a typical Housie/Bingo game ticket? - asp.net

I'm trying to create a typical Housie/Bingo Game ticket in Asp.net 2.0 (VB). But, not being succeeded. Ticket contains 3 row with 9 columns. Total 27 blocks, and it must be only 15 should be fill outta those 27. and each column contains value like 1st column should be between 1-10 and 2nd must have random values between 11-20.. It doesn't matter how many blocks filled in each column.. 1 is must, no single column should be blank, all 9 columns must be filled, some have all 3 blocks filled, some have 1 with total of 15 blocks filled in whole ticket. with random numbers..
Guys here was the typical housie ticket specification.. Please help me out generating a ticket like this. I've tried but, not being that much succeeded, I get whole column blank and validating columns.. takes extra load on system. please find me the way to make it.

You need deterministic algorithm
First redefine your requirements:
Every column should have at least 1 number, so no column should be completely blank
First column should have numbers from 1..10, second 11..20, third 21..30 and so on to the ninth column having from 81..90
only 15 numbers needed to fill the ticket
Additional requirement: Every row should have 5 numbers
This is how I'd do it:
First select 9 randoms (to satisfy first requirement)
1..10 - one random number from this range
11..20 - one random number from this range
...
81..90 - one random number from this range
Prepare an array (selectNums) of numbers 1..90 and remove all selected in step 1
Loop
get a random number from the selectNums array
add it to your ticket and remove it from the selectNums aray
if selected number fills a column of three then remove all numbers from that range from the selectNums array.
Go back to step 1 in the loop
This algorithm will take you exactly 9 steps + 6 steps in the loop so it's deterministic which is better for the processor utilization. And it also fills your ticket with up to three numbers per column and not less than 1 (if I understood your requirements due too poor english in the question).
Yo when you select random numbers you always select a number between 0 and selectNums array length which will give you position in array where you have to take a number from.
Additonal functionality to create the actual ticket
Above steps will get you to a point where you will get exactly 15 numbers with at most 3 from the same ten numbers range. Fine. All you have to do now is to create your ticket.
define 3 variables: row1Count, row2Count and row3Count and set them all to 0.
Fill the ticket by starting from the fully filled columns (all three numbers):
Get the first full column and fill it up in the ticket while also incrementing all three variables by one.
Remove these numbers from the selectNums array.
Go back to step 2.1.
Fill the ticket with columns with two numbers:
Get the first two numbers column. Fill them in the ticket by using three possible permutations of filling them in (1&2, 2&3, 1&3). Fill the first pair using the first permutation, second one with the second and so on. Don't forget to increment corresponding row counter variables.
remove those two numbers from selectNums array
Go back to step 3.1.
Fill the ticket with single number columns (those that have just one number):
Get the first number from selectNums array and put it in the row with the smallest count and put in on the ticket in that particular row. When there are at least two rows with the same count, you can select whichever you prefer by either selecting one randomly or taking the first one (quickest).
Remove the number from selectNums array
Go back to 4.1.
This part should get you to fully filled ticket with all columns having at least one number and all rows containing exactly 5 numbers in total.
If smaller numbers are not allowed to be under larger ones, you can always add an additional step to this process and reorder numbers in those columns that have more than just one number in it.
One final observation
This solution has been simplified by using arrays and counters. You could of course create a complete object model that would be functionally rich and would provide you all the info you need. You could for instance have a Ticket and TicketColumn classes:
public class TicketColumn
{
public int Count { get; }
public int? FirstRowValue { get; set; }
public int? SecondRowValue { get; set; }
public int? ThirdRowValue { get; set; }
...
public void Reorder() { ... }
}
public class Ticket
{
public TicketColumn[] Columns
public int FirstRowCount { get; private set; }
public int SecondRowCount { get; private set; }
public int ThirdRowCount { get; private set; }
...
}
Or something similar. This is just an idea that this whole program would be better off in object oriented manner.

I have prepared a code for playing Housie with an arbitrary number of players. It informs whether anyone has won the game and terminates when someone has won the full house
The approach given to this problem goes like this;
I have prepared 10 lists. Each list has with 3 unique random numbers arranged in ascending order, ranging from 10 to 20, 20 to 30, ..., 80 to 90. Next, I have assigned the first number in 5 random lists to the top row, the second number in another 5 random lists to the middle row, and the third number in another 5 random lists to the bottom row. I have done this with the intention of not repeating the numbers, ensuring that only 5 numbers are printed on each row of the ticket, each column has it's number in an ascending order form top to bottom
I have used empty strings ' ' to be printed where there are no numbers to be printed and I have used the asterisk/star ' * ' mark to tell to the player that he/she has marked that number on that ticket!
Here's a sample ticket;
<player name>, your ticket is as follows:-
[' ' ' ' ' ' '33' ' ' '54' '66' '72' '83']
[' ' '12' '27' ' ' '45' '57' ' ' ' ' '88']
['8' '19' '29' ' ' '49' ' ' ' ' '75' ' ']
<player name>, do you want to mark?(Type 'Yes' or 'No'):
I have then asked whether the player wants to mark. Then I ensure that the player inputs an integer present in the ticket and which has also been called
It's looks like this(after marking);
The lucky number is 54!
<player name>, your ticket is as follows:-
[' ' ' ' ' ' '33' ' ' '54' '66' '72' '83']
[' ' '12' '27' ' ' '45' '57' ' ' ' ' '88']
['8' '19' '29' ' ' '49' ' ' ' ' '75' ' ']
<player name>, do you want to mark?(Type 'Yes' or 'No'): Yes
<player name>, type the number you want to mark: 54
<player name>, your ticket is as follows:-
[' ' ' ' ' ' '33' ' ' '*54' '66' '72' '83']
[' ' '12' '27' ' ' '45' '57' ' ' ' ' '88']
['8' '19' '29' ' ' '49' ' ' ' ' '75' ' ']
Notice that there is an asterisk mark beside the integer 54
It then asks whether the user wants to check if he/she has won!
The confirmatory message regarding the winners is as follows;
<player name>, do you want to check if you have won?(Type 'Yes' or 'No'): Yes
Sorry <player name>, you have not won!
Jaldi 5 Winner: None
Top row winner: None
Middle row winner: None
Bottom row winner: None
Full house winner: None
I have ensured that the numbers called don't get repeated(The main board is a list with numbers ranging from 1 to 90 and each time a number is called the sam random number is removed from the main board and while the player is given the opportunity to mark, the code ensures that the number is present in the player's ticket and the number is not present in the main board. If the player inputs a number which doesn't satisfy the above mentioned conditions, it keeps on asking until the player input a correct number
The speciality of this code is that it accepts arbitrary number of players. It initially asks you the number of players playing the game and then asks that many times the name of each individual player
Finally, the code automatically gets terminated when a player wins the full house
Here's the code I've prepared;
import random
import numpy as np
def list_of_ten(lower_limit, upper_limit):
yield list(str(number) for number in range(lower_limit, upper_limit))
def replace(numbers_list, row, collection):
for element in numbers_list:
if len(element) == 1:
collection[row][0] = element
elif int(element) == 90:
collection[row][-1] = element
else:
collection[row][int(element[0])] = element
def check_number(number, array):
row_counter = 0
column_counter = 0
for row in array:
if number in row:
for element in row:
if element == number:
return True, tuple((row_counter, column_counter))
column_counter += 1
row_counter += 1
else:
return False, None
def class_instantiation(player_count, class_to_create):
names_dict = dict()
counter = 0
while counter < int(player_count):
temporaray_input = input(f"Enter the name of the player{counter + 1}: ")
names_dict[temporaray_input.lower()] = class_to_create(temporaray_input)
counter += 1
return names_dict
def call_method(diction):
for tup in diction.items():
diction[tup[0]].display_ticket()
diction[tup[0]].mark()
def call_numeral(diction):
for tup in diction.items():
return diction[tup[0]].call_number()
class Player:
board = list(range(1, 91))
jaldi_5_winner = None
top_row_winner = None
middle_row_winner = None
bottom_row_winner = None
full_house_winner = None
def __init__(self, name):
self.name = name
self.full_list = list()
self.check_top = list()
self.check_middle = list()
self.check_bottom = list()
n1 = random.sample(next(list_of_ten( 1, 10)), 3)
n2 = random.sample(next(list_of_ten(10, 20)), 3)
n3 = random.sample(next(list_of_ten(20, 30)), 3)
n4 = random.sample(next(list_of_ten(30, 40)), 3)
n5 = random.sample(next(list_of_ten(40, 50)), 3)
n6 = random.sample(next(list_of_ten(50, 60)), 3)
n7 = random.sample(next(list_of_ten(60, 70)), 3)
n8 = random.sample(next(list_of_ten(70, 80)), 3)
n9 = random.sample(next(list_of_ten(80, 91)), 3)
n1.sort()
n2.sort()
n3.sort()
n4.sort()
n5.sort()
n6.sort()
n7.sort()
n8.sort()
n9.sort()
number_list = [n1, n2, n3, n4, n5, n6, n7, n8, n9]
self.ticket = np.array([[' '] * 9] * 3)
self.top_row = [element[0] for element in random.sample(number_list, 5)]
self.middle_row = [element[1] for element in random.sample(number_list, 5)]
self.bottom_row = [element[2] for element in random.sample(number_list, 5)]
replace(self.top_row, 0, self.ticket)
replace(self.middle_row, 1, self.ticket)
replace(self.bottom_row, 2, self.ticket)
def display_ticket(self):
print("\n\n" + f"{self.name}, your ticket is as follows:-" + "\n")
print(self.ticket[0])
print(self.ticket[1])
print(self.ticket[2])
def call_number(self):
print(f"The lucky number is {Player.board.pop(Player.board.index(random.choice(Player.board)))}!")
def mark(self):
mark_it = input("\n" + f"{self.name}, do you want to mark?(Type 'Yes' or 'No'): ")
while not mark_it.lower() == 'yes' and not mark_it.lower() == 'no':
mark_it = input("\n" + f"{self.name}, please type 'Yes' or 'No' only: ")
if mark_it.lower() == 'yes':
mark_number = input("\n" + f"{self.name}, type the number you want to mark: " + " ")
condition = check_number(mark_number, self.ticket)
while not condition[0] or int(mark_number) in Player.board:
mark_number = input("\n" + "Type a number present in your ticket which has also been called: ")
condition = check_number(mark_number, self.ticket)
if mark_number in self.ticket[0]:
self.check_top.append(mark_number)
self.full_list.append(mark_number)
elif mark_number in self.ticket[1]:
self.check_middle.append(mark_number)
self.full_list.append(mark_number)
else:
self.check_bottom.append(mark_number)
self.full_list.append(mark_number)
self.ticket[condition[1][0]][condition[1][1]] = "*" + mark_number
self.display_ticket()
winner_input = input("\n" + f"{self.name}, do you want to check if you have won?(Type 'Yes' or 'No'): ")
while not winner_input.lower() == 'yes' and not winner_input.lower() == 'no':
winner_input = input("\n" + f"{self.name}, please type 'Yes' or 'No' only: ")
if winner_input.lower() == 'yes':
if len(self.full_list) == 5 and Player.jaldi_5_winner == None:
print("\n" + f"{self.name}, you have won jaldi 5!" + "\n")
Player.jaldi_5_winner = self.name
elif len(self.full_list) == 15 and Player.full_house_winner == None:
print("\n" + f"Congratulations, {self.name}, you have won the game!" + "\n")
Player.full_house_winner = self.name
elif len(self.check_top) == 5 and Player.top_row_winner == None:
print("\n" + f"{self.name}, you have won the top row!" + "\n")
Player.top_row_winner = self.name
elif len(self.check_middle) == 5 and Player.middle_row_winner == None:
print("\n" + f"{self.name}, you have won the middle row!" + "\n")
Player.middle_row_winner = self.name
elif len(self.check_bottom) == 5 and Player.bottom_row_winner == None:
print("\n" + f"{self.name}, you have won the bottom row!" + "\n")
Player.bottom_row_winner = self.name
else:
print("\n" + f"Sorry {self.name}, you have not won!" + "\n")
print(f" Jaldi 5 Winner: {Player.jaldi_5_winner} ")
print(f" Top row winner: {Player.top_row_winner} ")
print(f"Middle row winner: {Player.middle_row_winner}")
print(f"Bottom row winner: {Player.bottom_row_winner}")
print(f"Full house winner: {Player.full_house_winner}")
no_of_players = input("How many players are going to play housie?: ")
players_dict = class_instantiation(no_of_players, Player)
while True:
if Player.full_house_winner != None:
break
else:
call_numeral(players_dict)
call_method(players_dict)

Hello might be a decade late but here is how I did it. It's in C#
using System;
namespace HelloWorld
{
class Program
{
public static void Main (String[] args)
{
for(int times=0;times<2;times++)
{
startGame();
Console.WriteLine("******************************************************************");
}
}
private static void startGame()
{
int[,] game = new int[3, 9];
int occupancyLimit = 15;
while (occupancyLimit > 0)
{
int i = getRandomNumber(3);
int j = getRandomNumber(9);
//Console.Write(i);
//Console.Write(j);
// Console.Write(game[i,j]+" ");
int data = validateAndReturnNumber(i, j, game);
if (data>0)
{
game[i, j] = data;
occupancyLimit--;
//Console.WriteLine(game[i,j]);
}
}
for (int i = 0; i < game.GetLength(0); i++)
{
for (int j = 0; j < game.GetLength(1); j++)
{
Console.Write(game[i,j] + "\t");
}
Console.WriteLine();
}
}
private static int validateAndReturnNumber(int i, int j, int[,] game)
{
//do not override existing elements in array
if (game[i,j] != 0)
{
return -1;
}
//column cannot have more then two elements
int columncounter = 0;
for(int c=0;c<3;c++)
{
if(game[c,j]!=0)
{
columncounter++;
}
}
if(columncounter>=2)
{
return -1;
}
/*
//rows cannot have more
then two cells filled in and
//rows cannot have more
then two empty cells
for(int columnIndex=0;columnIndex<=6;columnIndex++)
{
if(game[i,columnIndex+2]!=0)
{
return -1;
}
}
*/
// rows cannot have more then 5 elements
int rowcounter = 0;
for(int r=0;r<9;r++)
{
if(game[i,r]!=0)
{
rowcounter++;
}
}
//Applying, rows cannot have more then 5 elements
if(rowcounter>=5)
{
return -1;
}
//return getRandomNumberForColumn(j);
int data = 0;
Boolean isValueSet = false;
do
{
data = getRandomNumberForColumn(j);
isValueSet = isValueExistsInCol(game, i, j, data);
} while (isValueSet);
return data;
}
private static bool isValueExistsInCol(int[,] game, int i, int j, int data)
{
Boolean status = false;
for(int k=0;k<3;k++)
{
if(game[k,j]==data)
{
status = true;
break;
}
}
return status;
}
private static int getRandomNumberForColumn(int high)
{
if(high==0)
{
high = 10;
}
else
{
high=(high + 1) * 10;
}
int low = high - 9;
Random random = new Random();
return random.Next(high-low)+low;
}
private static int getRandomNumber(int max)
{
Random random = new Random();
int num=random.Next(max);
return (num);
}
}
}

$arr = new SplFixedArray(27);
for($m=1;$m<=100000;$m++)
{
in:
$final_array = array();
foreach ( $arr as $key => $val )
$final_array[ $key+1 ] = $val;
$elements_array=array();
foreach ( $arr as $key => $val )
$elements_array[ $key+1 ] = $val;
for($i=1;$i<=count($elements_array);$i++)
{
if($i==1 || $i==10 || $i==19 )
{
$elements_array[$i]=rand(1,9);
}
if($i==2 || $i==11 || $i==20 )
{
$elements_array[$i]=rand(10,19);
}
if($i==3 || $i==12 || $i==21 )
{
$elements_array[$i]=rand(20,29);
}
if($i==4 || $i==13 || $i==22 )
{
$elements_array[$i]=rand(30,39);
}
if($i==5 || $i==14 || $i==23 )
{
$elements_array[$i]=rand(40,49);
}
if($i==6 || $i==15 ||$i==24 )
{
$elements_array[$i]=rand(50,59);
}
if($i==7 || $i==16 ||$i==25 )
{
$elements_array[$i]=rand(60,69);
}
if($i==8 || $i==17 || $i==26 )
{
$elements_array[$i]=rand(70,79);
}
if($i==9 || $i==18 || $i==27)
{
$elements_array[$i]=rand(80,90);
}
}
for($k=1;$k<=5;$k++)
{
$index1=rand(1,9);
$final_array[$index1]=$elements_array[$index1];
}
$x1 = 0;
$ar1=[];
for($q=1;$q<=9;$q++)
{
if(isset($final_array[$q]))
{
$ar1[$x1]= $q;
$x1++;
}
}
loop:
if($x1 != 5)
{
$in1 =rand(1,9);
if(!in_array($in1, array_keys($ar1)))
{
$final_array[$in1]=$elements_array[$in1];
$ar[$x1]= $in1;
$x1++;
}
goto loop;
}
$z1=0;
for($q=1;$q<=9;$q++)
{
if(isset($final_array[$q]))
{
$ar1[$x1]= $q;
$z1++;
}
}
if($z1 != 5)
goto in;
for($l=1;$l<=5;$l++)
{
$index2=rand(10,18);
$final_array[$index2]=$elements_array[$index2];
}
$x2 = 0;
$ar2=[];
for($q=10;$q<=18;$q++)
{
if(isset($final_array[$q]))
{
$ar2[$x2]= $q;
$x2++;
}
}
loop2:
if($x2 != 5)
{
$in2 =rand(10,18);
if(!in_array($in2, array_keys($ar2)))
{
$final_array[$in2]=$elements_array[$in2];
$ar[$x2]= $in2;
$x2++;
}
goto loop2;
}
$z2=0;
for($q=10;$q<=18;$q++)
{
if(isset($final_array[$q]))
{
$ar1[$x1]= $q;
$z2++;
}
}
if($z2 != 5)
goto in;
for($n=1;$n<=5;$n++)
{
$index3=rand(19,27);
$final_array[$index3]=$elements_array[$index3];
}
$x3 = 0;
$ar3=[];
for($q=19;$q<=27;$q++)
{
if(isset($final_array[$q]))
{
$ar3[$x3]= $q;
$x3++;
}
}
loop3:
if($x3 != 5)
{
$in3 =rand(19,27);
if(!in_array($in3, array_keys($ar3)))
{
$final_array[$in3]=$elements_array[$in3];
$ar[$x3]= $in3;
$x3++;
}
goto loop3;
}
$z3=0;
for($q=19;$q<=27;$q++)
{
if(isset($final_array[$q]))
{
$ar3[$x3]= $q;
$z3++;
}
}
if($z3 != 5)
goto in;
DB::table('tambola')->insert(['a1'=>$final_array[1],
'a2'=>$final_array[2],
'a3'=>$final_array[3],
'a4'=>$final_array[4],
'a5'=>$final_array[5],
'a6'=>$final_array[6],
'a7'=>$final_array[7],
'a8'=>$final_array[8],
'a9'=>$final_array[9],
'b1'=>$final_array[10],
'b2'=>$final_array[11],
'b3'=>$final_array[12],
'b4'=>$final_array[13],
'b5'=>$final_array[14],
'b6'=>$final_array[15],
'b7'=>$final_array[16],
'b8'=>$final_array[17],
'b9'=>$final_array[18],
'c1'=>$final_array[19],
'c2'=>$final_array[20],
'c3'=>$final_array[21],
'c4'=>$final_array[22],
'c5'=>$final_array[23],
'c6'=>$final_array[24],
'c7'=>$final_array[25],
'c8'=>$final_array[26],
'c9'=>$final_array[27],
]);
}

Related

Javafx Tree Table view: how to assign serial number to the direct child nodes of the root node

I am trying to number the direct child nodes of the root node in a serial manner (child-1, child-2...).
Here is my method which sets the cell value factory for myColumn:
private void setCellValueFactory() {
myColumn.setPrefWidth(120);
final int[] si_SubsetCount = {
1
};
myColumn.setCellValueFactory(
(TreeTableColumn.CellDataFeatures < MyDataClass, String > p) - > {
TreeItem < JVCC_PageHeaderInfo > ti_Row = p.getValue();
MyDataClass myDataClass = p.getValue().getValue();
String text;
if (ti_Row.isLeaf()) {
//leaf
} else if (ti_Row.getParent() != null) {
text = "Child-" + si_SubsetCount[0];
si_SubsetCount[0]++;
} else {
si_SubsetCount[0] = 1;
text = "Root";
}
return new ReadOnlyObjectWrapper < > (text);
});
}
But my output is as below:
>Root
>child-4
>leaf
>leaf
>child-8
>leaf
>leaf
I don't understand why the numbering is like 4, 8... instead of 1, 2...
Can someone help me with this.
That is because you can not control, when the CellValueFactorys method for evaluating the value for each row is called. It might get called several times for a single row, which is why your counter does not show the correct value for each line.
A dynamical approach is prefered here. If you should only have to differ between 3 node levels like root/child/leaf, then you could do something like this:
myColumn.setCellValueFactory( ( final CellDataFeatures<String, String> p ) ->
{
final TreeItem<String> value = p.getValue();
String text = "";
if ( value.isLeaf() )
text = "leaf";
else if ( value.getParent() != null )
text = "Child-" + (value.getParent().getChildren().indexOf( value ) + 1);
else
text = "root";
return new ReadOnlyStringWrapper( text );
} );
Since the Children of a TreeItem are stored in an ObservableList, you can just ask them for their index and add 1, since index starts at zero.

XtraGrid AutoFilterRow custom range filtering

I'm trying to improve the AutoFilterRow functionality for one of my columns. The column will always consist of a string that represents a range of values like this: "num1 - num2". I would like to allow end users to type a value into the cell in the AutoFilterRow and in this particular column and the rows whose sections have a range that includes the number they typed. For instance, if I had 3 rows and each of their section attributes were the following: "1 - 4", "1 - 6", and "4 - 6", and a user types "3" into the AutoFilterRow cell for this column, I would expect the rows containing "1 - 4" and "1 - 6".
I have already overwritten the CreateAutoFilterCriterion in MyGridView to allow for additional operators as suggested in several examples found on this site:
protected override CriteriaOperator CreateAutoFilterCriterion(GridColumn column, AutoFilterCondition condition, object _value, string strVal)
{
if ((column.ColumnType == typeof(double) || column.ColumnType == typeof(float) || column.ColumnType == typeof(int)) && strVal.Length > 0)
{
BinaryOperatorType type = BinaryOperatorType.Equal;
string operand = string.Empty;
if (strVal.Length > 1)
{
operand = strVal.Substring(0, 2);
if (operand.Equals(">="))
type = BinaryOperatorType.GreaterOrEqual;
else if (operand.Equals("<="))
type = BinaryOperatorType.LessOrEqual;
else if (operand.Equals("<>"))
type = BinaryOperatorType.NotEqual;
}
if (type == BinaryOperatorType.Equal)
{
operand = strVal.Substring(0, 1);
if (operand.Equals(">"))
type = BinaryOperatorType.Greater;
else if (operand.Equals("<"))
type = BinaryOperatorType.Less;
else if (operand.Equals("!") || operand.Equals("~"))
type = BinaryOperatorType.NotEqual;
}
if (type != BinaryOperatorType.Equal)
{
string val = strVal.Replace(operand, string.Empty);
try
{
if (!val.IsEmpty())
{
if (column.ColumnType == typeof(double))
{
var num = Double.Parse(val, NumberStyles.Number, column.RealColumnEdit.EditFormat.Format);
return new BinaryOperator(column.FieldName, num, type);
}
if (column.ColumnType == typeof(float))
{
var num = float.Parse(val, NumberStyles.Number, column.RealColumnEdit.EditFormat.Format);
return new BinaryOperator(column.FieldName, num, type);
}
else
{
var num = int.Parse(val, NumberStyles.Number, column.RealColumnEdit.EditFormat.Format);
return new BinaryOperator(column.FieldName, num, type);
}
}
// DateTime example:
// DateTime dt = DateTime.ParseExact(val, "d", column.RealColumnEdit.EditFormat.Format);
// return new BinaryOperator(column.FieldName, dt, type);
}
catch
{
return null;
}
}
}
//
// HERE IS WHERE I WANT TO ADD THE FUNCTIONALITY I'M SPEAKING OF
//
else if (column.FieldName == "SectionDisplayUnits")
{
try
{
if (!strVal.IsEmpty())
{
}
}
catch
{
return null;
}
}
return base.CreateAutoFilterCriterion(column, condition, _value, strVal);
}
How would I go about doing that? I figure I want to split each string with a call to Split(...) like this: cellString.Split(' - '). Then I would parse each string returned from the call to Split(...) into a number so that I could use inequality operators. But I'm just not sure how to go about doing this. Can I get some help? Thanks!
Update:
Please take a look here for a more in-depth discussion on this matter with myself and a knowledgeable DevExpress representative. I received a lot of help and I wanted to share this knowledge with whoever needs similar assistance. Here is the link.
Using C#, you would split the value into two parts, convert them to the number, and compare the value entered by the user with both values to ensure that it is greater or equal the first part and less or equal the second part.
In Criteria Language, the same functionality can be created using Function Operators. However, the expression will be a bit complex. Please try the following. It will work only if the format of values in the SectionDisplayUnits column is fixed, and the value always consists of two numbers delimited by "-".
string rangeDelimiter = "-";
return CriteriaOperator.Parse("toint(trim(substring(SectionDisplayUnits, 0, charindex(?, SectionDisplayUnits)))) <= ? && toint(trim(substring(SectionDisplayUnits, charindex(?, SectionDisplayUnits) + 1, len(SectionDisplayUnits) - charIndex(?, SectionDisplayUnits) - 1))) >= ?", rangeDelimiter, _value, rangeDelimiter, rangeDelimiter, _value);

Specific row withing a DataTable

I have a data table which has a "Total" column. I want to be able to get a specific rows "Total" not all rows.
public void maxValue()
{
string pass = (String)Session["name"];
DataTable table = (DataTable)Session["CocaCola"];
int total = table.AsEnumerable().Sum(r => r.Field<int>("Total"));
int totalAllowed = table.AsEnumerable().Sum(r => r.Field<Int32>("Total Allowed"));
if (total >= totalAllowed)
{
Label1.Text = "Total value exceeded the maximum of " + totalAllowed;
}
else if (total < totalAllowed)
{
Label1.Text = "Total value which is allowed :" + totalAllowed;
}
if (pass.Equals("Low"))
{
Label1.Text = "You are not allowed any assets at this Stage";
//SNS.Checked = false;
//TT.Checked = false;
//Music.Checked = false;
//SNS.Enabled = false;
//TT.Enabled = false;
//Music.Enabled = false;
}
}
As you can see my method works but add the column up which i dont want to do. How would i go about changing it?
You can do it this way
int yourTargetindex = 0; //Change this to get the value of your target element
int total =(from row in table.AsEnumerable()
select row.Field<int>("Total")).ElementAt(yourTargetindex);
//This will return the first value of "total" in the DataTable
You don't have to use linq. DataTable has built-in methods for this kind of operations:
var selectedTotal = table.Compute("sum(Total)", "columnX == 'x'");
This tell the table to calculate the sum of all Total cells in rows where columnX has the specified value.
Of course you can use linq. You would need to add a Where() before you calculate the sum.

queries in entity framework

i have to fetch those records where cityname like'zipcode' where zipcode is variable and apply conditions
var zipcd = (from u in db.ZipCodes1
where u.CityName.Contains(zipcode) && u.CityType == "D"
select u).ToList().Select(u => new Viewsearch
{
Zipcode = u.ZIPCode,
CityName = u.CityName,
stateabbr = u.StateAbbr
}).Distinct();
Viewsearch vs = (Viewsearch)zipcd;
if (zipcd.Count() > 1)
{
locations = "United States;" + vs.stateabbr + ";" + vs.CityName;
}
else if (locations == "")
{
locations = "United States;" + vs.stateabbr + ";" + vs.CityName;
}
else
{
locations = "United States;" + vs.stateabbr + ";" + vs.CityName + "," + locations;
}
if (zipcd.Count() > 3) is greater than 3
{
locations = locations.Replace(locations, "," + "<br>");
}
The problem is that you're casting an iterator to the type of a single element on the line
ViewSearch vs = (ViewSearch)zipcd.
If you want vs to be a single object, you must call First() or FirstOrDefault() on your collection:
ViewSearch vs = zipcd.First(); // Throws if there are no elements
ViewSearch vs = zipcd.FirstOrDefault(); // null if there are no elements
First of all I would suggest that you download and use the lovely LINQPad not only to run your LINQ queries first but also to learn from it (has a lot of samples that you can run right form there, no more config needed)
for your question:
var zipcd = (
from u in db.ZipCodes1
where u.CityName.Contains(zipcode) && u.CityType == "D"
select new Viewsearch
{
Zipcode = u.ZIPCode,
CityName = u.CityName,
stateabbr = u.StateAbbr
}).Distinct().ToList();
As you can see the query works:
Distinct at the end of your query uses IEqualityComparer, and I'm guessing you haven't defined one for Viewsearch. It would look something like this:
public class ViewsearchComparer : IEqualityComparer<Viewsearch>
{
public bool Equals(Viewsearch vs1, Viewsearch vs2)
{
// Implementation
}
public int GetHashCode(Viewsearch vs)
{
// Implementation
}
}
After you have that defined, you pass it into your distinct call:
.Select(u => new Viewsearch
{
Zipcode = u.ZIPCode,
CityName = u.CityName,
Stateabbr = u.StateAbbr
})
.Distinct(new ViewsearchComparer());

How to do Previous and Next item on a List<G>

I have a class called Person, which contains various properties such as first name, last name, etc.
I have a List that contains n instances of Person.
List<Person> lstPerson = new List<Person>();
What I need to be able to do is search lstPerson for a given person, and having found that person then obtain the previous and next person relative to the person's item position in lstPerson.
Person p = lstPerson.Find(delegate(Person o) { return o.FirstName == "Joe"; });
// Then use an accessor to get the previous and next persons
Person prevPerson = p.Previous();
Person nextPerson = p.Next();
Is there a better way to do this then the one that I stated above? What I don't like about the above solution is that I have to construct the previous and next pointers at the time that I build the Person List.
You could do something like the following:
int personIndex = lstPerson.FindIndex(delegate(Person o) { return o.FirstName == "Joe" });
Person p = lstPerson[personIndex];
// verify that personIndex+1 and personIndex-1 still fall within the list
Person prevPerson = lstPerson[personIndex-1];
Person nextPerson = lstPerson[personIndex+1];
Hmm.. why not simply using the LinkedList class?
It comes with Next and Previous built in.
You could do this, which skips elements until the next element matches or it has gone through the entire list:
var list = (new List<Person>() { null }).Concat(lstPerson);
var p = list.SkipWhile((x, index) => { var n = list.ElementAtOrDefault(index + 1); return n == null || n.FirstName != name; }).Take(3);
Person previous = p.FirstOrDefault();
Person person = p.ElementAtOrDefault(1);
Person next = p.ElementAtOrDefault(2);
Although this (similar to #marcind's answer) might be clearer:
Person person = lstPerson.Find(p => p.FirstName == name);
Person previous = null;
Person next = null;
if (person != null)
{
int index = lstPerson.IndexOf(person);
previous = lstPerson.ElementAtOrDefault(index - 1);
next = lstPerson.ElementAtOrDefault(index + 1);
}

Resources