|
This is my code which is not returning data as per my requirement. So please rectify my code which will give me the desired output.
static void Main(string[] args)
{
List<int> test1 = DivideInt(10,1).ToList().OrderBy(s=> s).ToList();
List<int> test2 = DivideInt(10, 2).ToList().OrderBy(s => s).ToList();
List<int> test3 = DivideInt(10, 3).ToList().OrderBy(s => s).ToList();
List<int> test4 = DivideInt(10, 4).ToList().OrderBy(s => s).ToList();
List<int> test5 = DivideInt(10, 5).ToList().OrderBy(s => s).ToList();
List<int> test6 = DivideInt(10, 6).ToList().OrderBy(s => s).ToList();
List<int> test7 = DivideInt(10, 7).ToList().OrderBy(s => s).ToList();
List<int> test8 = DivideInt(10, 8).ToList().OrderBy(s => s).ToList();
List<int> test9 = DivideInt(10, 9).ToList().OrderBy(s => s).ToList();
List<int> test10 = DivideInt(10, 10).ToList().OrderBy(s => s).ToList();
}
public static IEnumerable<int> DivideInt(int pagetotal, int userinput)
{
if(userinput==0)
{
yield return 0;
}
else
{
int rest =pagetotal % userinput;
double result =pagetotal / (double) userinput;
for(int i=0; i< userinput;i++)
{
if(rest-- >0)
yield return (int) Math.Ceiling(result);
else
yield return (int) Math.Floor(result);
}
}
}
My requirement as following.
1) if total page is 10 and user split into 2 files then two files will be generated each file will have 5 pages
2) if total page is 10 and user split into 3 files then 3 files will be generated. first 2 files will have 3 pages and last pages will have 4 pages.
3) if total page is 10 and user split into 4 files then 4 files will be generated. first 3 files will have 3 pages and last pages will have 1 pages.
4) if total page is 10 and user split into 5 files then 5 files will be generated. each files will have 2 pages
5) if total page is 10 and user split into 6 files then first 5 files will be generated with 1 page. last file will have 5 pages
6) if total page is 10 and user split into 7 files then first 6 files will be generated with 1 page. last file will have 4 pages.
7) if total page is 10 and user split into 8 files then first 7 files will be generated with 1 page. last file will have 3 pages.
8) if total page is 10 and user split into 9 files then first 8 files will be generated with 1 page. last file will have 2 pages.
8) if total page is 10 and user split into 10 files then 10 files will be generated with 1 page.
again
1) if total page is 9 and user split into 2 files then first file will be generated with 4 page. last file will have 5 pages.2) if total page is 9 and user split into 3 files then each 3 files will have 3 pages.
3) if total page is 9 and user split into 4 files then first 3 files will have 2 pages and last page will have 3 pages.
4) if total page is 9 and user split into 5 files then first 4 files will have 2 pages and last page will have 2 pages.5) if total page is 9 and user split into 6 files then first 5 files will have 1 pages and last page will have 4 pages.
6) if total page is 9 and user split into 7 files then first 6 files will have 1 pages and last page will have 3 pages.
7) if total page is 9 and user split into 8 files then first 7 files will have 1 pages and last page will have 2 pages.
8) if total page is 9 and user split into 9 files then each file will have 1 pages.
Hopefully I am clear what I am looking for.
The output i am getting from my program.
Here i am mentioning what kind of output i am getting from above code and what kind of i am expecting.
1) List test4 = DivideInt(10, 4).ToList().OrderBy(s => s).ToList(); output is getting 2,2,3,3 but output should be 2,2,2,4
2) List test6 = DivideInt(10, 6).ToList().OrderBy(s => s).ToList(); output is getting 1,1,2,2,2,2 but output should be 1,1,1,1,1,5
3) List test7 = DivideInt(10, 7).ToList().OrderBy(s => s).ToList(); output is getting 1,1,1,1,2,2,2 but output should be 1,1,1,1,1,1,4
4) List test8 = DivideInt(10, 8).ToList().OrderBy(s => s).ToList(); output is getting 1,1,1,1,1,1,2,2 but output should be 1,1,1,1,1,1,1,3
5) List test9 = DivideInt(10, 9).ToList().OrderBy(s => s).ToList(); output is getting 1,1,1,1,1,1,1,1,2 but output should be 1,1,1,1,1,1,1,1,2
please guide me what to change in routine DivideInt() thanks
modified 12-Aug-18 12:10pm.
|
|
|
|
|
I would define the number of groups then add the pages to the groups, then add the remaining pages to the groups starting at group 0. The I would go get the integers for each page in each group.
Never underestimate the power of human stupidity
RAH
|
|
|
|
|
Hi,
I'm confused, your code is implementing something that is harder than what your requirements stipulate, assuming I understood them correctly, as in: generate N positive integers totalling SUM, where the first N-1 numbers are identical and maximal.
If so, this would be the "algorithm" for N>0 and SUM>=0:
for(int i=0; i<N-1; i++) yield return SUM/N;
yield return SUM-SUM/N*(N-1);
As this is an integer problem, no doubles are involved; for positive numbers integer divide returns the (floored) quotient.
Further comment: I see no need to order the list as you do, and if you really want a List<int> then why do you use IEnumerable.ToList, your method could create a List<int> straight away...
|
|
|
|
|
How can I get meta data of any given file in asp.net core
|
|
|
|
|
It depends on the file type and where it stores its meta data. Please edit your question and provide proper details of your problem.
|
|
|
|
|
Hi, i've got a listbox that populates with servers trough an LDAP query
when doublclicking on a server a tab is created with an RDP session
this works perfectly to create the RDP
is there a way that i can close the tabs and disconnect that active rdp session?
right now it only closes the tab but the session remains active.
i'm using
AxMsRdpClient9NotSafeForScripting
thanks
|
|
|
|
|
I love the name of the control you are using in your script
Can't you detect the onclosing event of the tab and kill the RDP session in that event or do you mean you can't kill the session from c#!
Never underestimate the power of human stupidity
RAH
|
|
|
|
|
this is what happends when the new tab is created
TabPage page = new TabPage(lbServers.SelectedItem.ToString());
page.Name = lbServers.SelectedItem.ToString();
tabControl1.TabPages.Add(page);
tabControl1.SelectedTab = page;
AxMsRdpClient9NotSafeForScripting rdpWindows = new AxMsRdpClient9NotSafeForScripting();
rdpWindows.Dock = DockStyle.Fill;
page.Controls.Add(rdpWindows);
rdpWindows.AdvancedSettings9.NegotiateSecurityLayer = true;
rdpWindows.AdvancedSettings9.SmartSizing = true;
rdpWindows.Domain = txtDomain.Text;
rdpWindows.UserName = txtUser.Text;
rdpWindows.AdvancedSettings9.ClearTextPassword = txtPass.Text;
rdpWindows.Server = page.Name;
rdpWindows.Connect();
as the tabs name contains the RDP server name i tough i would be able to properly close the connection that way but somehow it doesn't work.
|
|
|
|
|
Where do you call Disconnect?
This space for rent
|
|
|
|
|
i don't call disconnect becaus it doesn't work when closing the tab
there is no point in opening a tab and closing the connection
somehow i guess i need to be able to refere to the docked rdp and close that but i have no clue how to access it
|
|
|
|
|
If you don't call Disconnect, you're not going to be able to release the active session. When you are closing the TabPage, you need to call Disconnect[^].
This space for rent
|
|
|
|
|
At a guess you abandon the connection when it moves out of scope and therefore you have nothing to disconnect.
Member 11441622 wrote: AxMsRdpClient9NotSafeForScripting rdpWindows = new AxMsRdpClient9NotSafeForScripting();
Try moving this to a class level variable instead of a method level variable. Then the tab close event should be able to pick up the rdpWindows variable and disconnect the session.
Never underestimate the power of human stupidity
RAH
|
|
|
|
|
i tried that once before and that results in an error when doing this:
rdpWindows.Server = tabControl1.SelectedTab.Name.ToString();
rdpWindows.Disconnect();
error trown:
System.Runtime.InteropServices.COMException: 'Error HRESULT E_FAIL has been returned from a call to a COM component.'
|
|
|
|
|
Member 11441622 wrote: rdpWindows.Server = tabControl1.SelectedTab.Name.ToString();
rdpWindows.Disconnect();
So you think a string = a rdp server. The tab name is a string not an object
Member 11441622 wrote: AxMsRdpClient9NotSafeForScripting rdpWindows Declare that as a class level variable.
Never underestimate the power of human stupidity
RAH
|
|
|
|
|
I have the following setup:
public interface ITest
{
TestResult PerformTest();
}
public class Test1 : ITest
{
public TestResult PerformTest()
{
Thread.Sleep(60 * 10 * 1000);
return TestResult.Failed;
}
}
public class Test2 : ITest
{
public TestResult PerformTest()
{
Thread.Sleep(60 * 2 * 1000);
return TestResult.Passed;
}
}
public enum TestResult
{
Failed,
Passed
}
class Program
{
static List<Task> tasks = new List<Task>();
static void Main(string[] args)
{
List<ITest> tests = new List<ITest>
{
new Test1(),
new Test2()
};
foreach (var test in tests)
{
var task = Task.Factory.StartNew(() =>
{
TestResult testResult = test.PerformTest();
return testResult;
});
tasks.Add(task);
}
try
{
Task.WaitAll(tasks.ToArray());
}
catch (Exception e)
{
throw e;
}
}
}
Inside test2 I need to know when test1 is finshed and pause execution until it is. Would a ManualResetEvent work here? If so, where do I define it? Would I then pass a reference to it to all other classes that need to know when Test1 is done?
If not, is there a better way to do this?
If it's not broken, fix it until it is.
Everything makes sense in someone's mind.
Ya can't fix stupid.
|
|
|
|
|
Something like this should work:
public class Test1 : ITest
{
private readonly ManualResetEventSlim _mre;
public Test1(ManualResetEventSlim mre)
{
_mre = mre;
}
public TestResult PerformTest()
{
try
{
Thread.Sleep(60 * 10 * 1000);
return TestResult.Failed;
}
finally
{
_mre.Set();
}
}
}
public class Test2 : ITest
{
private readonly ManualResetEventSlim _mre;
public Test2(ManualResetEventSlim mre)
{
_mre = mre;
}
public TestResult PerformTest()
{
Thread.Sleep(60 * 2 * 1000);
_mre.Wait();
return TestResult.Passed;
}
}
static class Program
{
static void Main()
{
var mre = new ManualResetEventSlim();
var tests = new List<ITest>
{
new Test1(mre),
new Test2(mre),
};
var tasks = new List<Task>();
foreach (ITest test in tests)
{
Task task = Task.Run(() => test.PerformTest());
tasks.Add(task);
}
Task.WaitAll(tasks.ToArray());
}
}
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
If you know the thread instance, then it's easy: Thread.Join Method (System.Threading)[^] will do it for you.
If you don't - and you probably don't in your example - then have you considered a lock statement?
lock Statement (C# Reference) | Microsoft Docs[^] If you lock a variable at the start of Thread1, and try to grab the lock at the end of Thread2, it will have to halt until the lock is available - which means that Thread1 is finished.
Sent from my Amstrad PC 1640
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
OK, I see.
Did you see Richard's response? I'm curious what your thoughts are on his reply.
If it's not broken, fix it until it is.
Everything makes sense in someone's mind.
Ya can't fix stupid.
|
|
|
|
|
I hadn't seen it, but now I have ... I've not used ManualResetEventSlim so I'll have to read up on it at some point - the MSDN description isn't exactly helpful, so I can't comment on his solution. Richard knows his stuff though, so it'll probably work!
Sent from my Amstrad PC 1640
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
|
Hello
i créate 10 threads to do a task.
i create a Semapohre to limit access at compteur by 3 threads
how to lock data (compteur)
namespace threads
{
class Program
{
public static int compteur;
public static object ob = new object();
public static SemaphoreSlim sem = new SemaphoreSlim(3);
public static void Thread_test() {
sem.Wait();
for (int i = 0; i < 1000000; i++)
{
compteur++;
}
sem.Release();
System.Console.WriteLine(compteur.ToString());
}
static void Main(string[] args)
{
Thread[] th = new Thread[10];
for (int i = 0; i < th.Length; i++)
{
th[i] = new Thread(Thread_test)
{
Name = "thread_" + i
};
th[i].Start();
}
System.Console.ReadLine();
}
}
}
Result:
thread_2 = 1264634
thread_0 = 1440996
thread_1 = 1645012
thread_3 = 2344585
thread_5 = 2694858
thread_4 = 2809001
thread_6 = 3628891
thread_8 = 3651918
thread_7 = 3991965
thread_9 = 4527904
and i want this without lock function just with Semaphore:
thread_3 = 1893992
thread_1 = 2735536
thread_4 = 4274643
thread_2 = 4349873
thread_0 = 6248051
thread_5 = 7430503
thread_6 = 8107979
thread_7 = 8937401
thread_9 = 9815069
thread_8 = 10000000
Thank you so much
|
|
|
|
|
Don't cross post: you already have this in QA, so posting it in multiple places just duplicates work and that annoys people. Pick one place, and stick to it.
Sent from my Amstrad PC 1640
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
Based on the time-stamps, the copy in QA is the repost.
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
You have up to three threads modifying the same shared variable at the same time, without any coordination. This will not end well.
For example:
Thread 0: Read compteur == 0
Thread 1: Read compteur == 0
Thread 0: Update compteur = compteur + 1 == 1
Thread 2: Read compteur == 1
Thread 2: Update compteur = compteur + 1 == 2
Thread 1: Update compteur = compteur + 1 == 1
Three threads have incremented the same variable, but the value has only increased by 1 .
Things get even more complicated when you start considering memory models, CPU cache, speculative execution, ...
To safely increment the value within your thread, you need to use Interlocked.Increment[^]:
public static void Thread_test()
{
sem.Wait();
int result = 0;
for (int i = 0; i < 1000000; i++)
{
result = Interlocked.Increment(compteur);
}
sem.Release();
System.Console.WriteLine(result);
}
To do anything more complicated, you will need to use locks or other coordination primitives to prevent the shared state from being modified by multiple threads at the same time.
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
thank you for your answer,
I understand the principle for the increment.
if i understand Semaphore can just manage the number of threds to acces the data, but dont manage the lock of the data to use it.
it is necessary to use lock or other to lock the data? or i(t possible to do that with semaphore
Here i use an compteur for example.
i see a lot of youtube'movie but i'don't find a complete toturiel with lock mutex moniter somaphore threads.
thank you
|
|
|
|
|