AsParallel writing to same object - c#

I have a Dictionary with Key-Value pair where Value is a complex Object.
Becaouse of a speed I have used AsParalle().
Problem that occures is that in some of my return objects are placed multiple results of other Key-Value pair.
For examle:
ResutDict has multiple Key-Value pairs.
public IDictionary<string, IOutboundResult> ResultDict
{
get { return m_ResultDict; }
set { m_ResultDict = value; }
}
ResultDict.AsParallel()
.WithDegreeOfParallelism(amountOfThreads)
.ForAll(kvp => { DO YOUR THING AND RETURN OBJECT S_Out}
All of them should return one Object. That later will be serialized into XML.
public class S_Out : ISerializable
{
private List<details> detailField;
[System.Xml.Serialization.XmlElement("details")]
public List<details> details
{
get { return detailField; }
set { detailField = value; }
}
}
public class details
{
private string idField;
private string countryField;
private string town_cityField;
private string postcodeField;
private List<extract> extractField;
public string id
{
get { return idField; }
set { idField = value; }
}
public string country
{
get { return countryField; }
set { countryField = value; }
}
public string town_city
{
get { return town_cityField; }
set { town_cityField = value; }
}
public string postcode
{
get { return postcodeField; }
set { postcodeField = value; }
}
[XmlElement("extract")]
public List<extract> extract
{
get { return extractField; }
set { extractField = value; }
}
}
This list of details is there only for some other cases, but in this particular case should contain only one detail.
During Parallel different Threads write in there so in some files I have no detail object, and in some of them whole list of details.
It should be one detail for one xml file.
Have anyone Idea why is this happening?

Related

Issue in getting complex object in Web API Post

I'm making ajax POST call to my web API and posting a JSON. Below is my code
C# class:
public class Employee:EmployeeBase
{
private string _EId;
private string _EName;
private string _Designation;
private EmployeeBase[] _Expirence;
public string EId
{
get { return _EId; }
set { _EId = value; }
}
public string EName
{
get { return _EName; }
set { _EName = value; }
}
public string Designation
{
get { return _Designation; }
set { _Designation = value; }
}
public Expirence[] MyExpirence
{
get { return _Expirence; }
set { _Expirence = value; }
}
}
public class EmployeeBase
{
private string _Id;
private string _Company;
private string _Years;
public string Id
{
get { return _Id; }
set { _Id = value; }
}
public string Company
{
get { return _Company; }
set { _Company = value; }
}
public string Years
{
get { return _Years; }
set { _Years = value; }
}
}
Controller:
[HttpPost]
public ActionResult SaveAssociatDisassociateCameras(Employee zone)
{
}
Sample JSON:
Sample 1 :
{
"Id":"E100",
"Name":"TestEmployee",
"Designation":"Test Engineer",
"MyExpirence":[
{
"Id":"01",
"Company":"Company1",
"Years":"10"
}
]
}
Sample 2 :
{
"Id":"E100",
"Name":"TestEmployee",
"Designation":"Test Engineer",
"MyExpirence":[
{
"Id":"01",
"Company":"Company1",
"Years":"10"
}
],
"DummyArray":[
]
}
Now the issue is when I post Sample 1 JSON is getting properly posted to controller. But in controller MyExpirence array is null. But I'm getting values for EId,EName etc. Only MyExpirence array is null.
In other hand if I post Sample 2 adding a dummy array to the JSON I'm getting proper values. In this case I'm getting proper value for EId,EName and even for MyExpirence array.
I cant understand why I'm getting null for MyExpirence in Sample 1. And I'm not okay with the Sample 2 solution. I want a correct way of doing this.
Your code won't compile: _Expirence is different to MyExpirence property. Fix it like in next sample
public class Employee:EmployeeBase
{
private string _EId;
private string _EName;
private string _Designation;
private EmployeeBase[] _Expirence;
public string EId
{
get { return _EId; }
set { _EId = value; }
}
public string EName
{
get { return _EName; }
set { _EName = value; }
}
public string Designation
{
get { return _Designation; }
set { _Designation = value; }
}
public Expirence[] MyExpirence
{
get { return _Expirence; }
set { _Expirence = value; }
}
}

Custom Collection/List To Store Custom Objects

I have a customer object class:
public class customerObject
{
private string _address1;
private string _address2;
private string _address3;
private string _category;
private string _country;
private string _county;
private string _custcode;
private string _fullname;
private string _int_rep_hou;
private string _int_rep_key;
private double _lat;
private double _lng;
private string _postcode;
private string _rep_code;
private string _telephone;
public customerObject()
{
}
public string Address1
{
get { return _address1; }
set { _address1 = value; }
}
public string Address2
{
get
{
return _address2;
}
set { _address2 = value; }
}
public string Address3 { get { return _address3; } set { _address3 = value; } }
public string Category
{
get { return _category; }
set { _category = value; }
}
public string Country { get { return _country; } set { _country = value; } }
public string County { get { return _county; } set { _county = value; } }
public string Custcode
{
get { return _custcode; }
set { _custcode = value; }
}
public string Fullname
{
get { return _fullname; }
set { _fullname = value; }
}
public string Int_rep_hou
{
get { return _int_rep_hou; }
set { _int_rep_hou = value; }
}
public string Int_rep_key
{
get { return _int_rep_key; }
set { _int_rep_key = value; }
}
public double Lat { get { return _lat; } set { _lat = value; } }
public double Lng { get { return _lng; } set { _lng = value; } }
public string Postcode { get { return _postcode; } set { _postcode = value; } }
public string Rep_code
{
get { return _rep_code; }
set { Rep_code = value; }
}
public string Telephone { get { return _telephone; } set { _telephone = value; }
}
}
I have a CustomCollections class
public class CustomerCollection
{
public List<customerObject> Customers { get; set; }
}
My method that loops through dt rows and converts to a customer object
public List<Valueobjects.CustomerCollection> dolist(DataTable temptablename)
{
//Create Collection Object
Valueobjects.CustomerCollection Collection = new Valueobjects.CustomerCollection();
foreach (DataRow row in temptablename.Rows)
{
//Create Customer Object
Valueobjects.customerObject Customer = new Valueobjects.customerObject();
//set values of customer object
Customer.Rep_code = "";
Customer.Int_rep_key = "";
Customer.Int_rep_hou = "";
Customer.Fullname = row["Fullname"].ToString().Trim();
Customer.Custcode = row["Custcode"].ToString().Trim();
Customer.Category = row["Category"].ToString().Trim();
Customer.Address1 = row["Address1"].ToString().Trim();
Customer.Address2 = row["Address2"].ToString().Trim();
Customer.Address3 = row["Address3"].ToString().Trim();
Customer.Postcode = row["Postcode"].ToString().Trim();
Customer.Country = row["Country"].ToString().Trim();
Customer.Telephone = row["Telephone"].ToString().Trim();
Customer.Lat = Convert.ToDouble(row["Lat"]);
Customer.Lng = Convert.ToDouble(row["Lng"]);
Customer.County = row["County"].ToString().Trim();
//add to the collection (list)
Collection.Customers.Add(Customer);
}
temptablename = null;
return Collection;
}
However when I create a new Customer object and a new CustomerCollection object I am getting an error when adding the customer to the collection list.
Error:
Error 32 Cannot implicitly convert type
'Classes.Valueobjects.CustomerCollection' to
'System.Collections.Generic.List'
Your method is returning a List<CustomerCollection>:
public List<Valueobjects.CustomerCollection> dolist(DataTable temptablename)
{
//...
}
But the code is trying to return a CustomerCollection:
return Collection;
Just as the error says, these two types are different.
If a CustomerCollection is already a collection of customers, then semantically what is a List<Valueobjects.CustomerCollection>? A collection of collections? It seems like you're over-pluralizing your objects :)
There are two approaches here. Either return a CustomerCollection from the method:
public CustomerCollection dolist(DataTable temptablename)
{
//...
}
Or use a List<Customer> if you want to use generic lists as your collection containers:
public List<Customer> dolist(DataTable temptablename)
{
//...
var Collection = new List<Customer>();
//...
Collection.Add(Customer);
//...
return Collection;
}
Side note: You may want to stick to C# conventions for variable naming. As you can see from the code highlighting here on Stack Overflow, your variable names can easily be mistaken for classes/types, which can cause confusion when supporting the code.
Return a CustomerCollection instead of a List<Valueobjects.CustomerCollection>:
public Valueobjects.CustomerCollection Dolist(DataTable temptablename)
{
// ...
Your object has a list, it is not a list.
MSDN: Inheritance

c# casting string to class object

i want to cast a string from database to a class object without having to go over each possible outcome.
so not
if(type.StartsWith("ContactPersonType")){//} else if(type.StartsWith("ContactPersonTitle")){//}
this is what i have so far
private static T Create<T>(IDataRecord record)
{
var properties = typeof(T).GetProperties();
var returnVal = Activator.CreateInstance(typeof(T));
properties.ToList().ForEach(item =>
{
string type = item.GetMethod.ReturnParameter.ParameterType.Name;
if (type.StartsWith("ContactPerson"))
{
Type t = Type.GetType(item.GetMethod.ReturnParameter.ParameterType.ToString());
item.SetValue(returnVal, Convert.ChangeType(record[item.Name].ToString(), t));
}
else if (!type.StartsWith("ObservableCollection"))
{
item.SetValue(returnVal, Convert.ChangeType(record[item.Name].ToString(), item.PropertyType));
}
});
return (T)returnVal;
}
public class ContactPersonType
{
private int _id;
public int ID
{
get { return _id; }
set { _id = value; }
}
private String _name;
public String Name
{
get { return _name; }
set { _name = value; }
}
}
thanks
Use an anonymous collection when you want a certain action to apply to different input values.
foreach(var option in new[] {"ContactPerson", "ContactPersonTitle" }){
if (type.StartsWith(option))
{
Type t = Type.GetType(item.GetMethod.ReturnParameter.ParameterType.ToString());
item.SetValue(returnVal, Convert.ChangeType(record[item.Name].ToString(), t));
}
}

CustomeProfile class, list of key-value pair is not saving

public class KeyValue : ProfileBase
{
public KeyValue()
{ }
public List<KeyValuePair<string, string>> pair
{
get { return (List<KeyValuePair<string,string>>)base["pair"]; }
set { base["pair"] = value; }
}
public string Name
{
get { return base["Name"] as string; }
set { base["Name"] = value; }
}
}
Whats the problem in this CustomProfile class.I am saving the list of key-value pairs but when i am accessing it show null in each pair, but it gives name correctly

Bind complex list to datasource a gridview

whether possible Bind complex list to DataSource a GridView with all members?
such as:
public class Car
{
private string _make;
private string _model;
private int _year;
private int _speedCollection;
public Car(string make, string model, int year)
{
_make = make;
_model = model;
_year = year;
}
public string Make
{
get { return _make; }
set { _make = value; }
}
public string Model
{
get { return _model; }
set { _model = value; }
}
public int Year
{
get { return _year; }
set { _year = value; }
}
public List<MyClass> SpeedColections
{
get { return _speedCollection; }
set { _speedCollection = value; }
}
}
public class MyClass
{
private int _speed;
public int Speed
{
get { return _speed; }
set { _speed = value; }
}
}
Yes, it is possible. And it will work, except for the SpeedCollections member, unless you specify another public member that would return, say, a string representation of Speed (comma separated values or something of this sort)
Update
This is an example of a member that would return a string representation of SpeedCollections:
Warning! Potential pseudo-code ahead, I cannot currently compile or test, so make your adjustments when needed
public string SpeedRepresentation
{
get
{
return string.Join(",",
_speedCollection.Select(s => s.Speed().ToString())
.ToArray());
}
}

Categories