2011-02-07 3 views
3

Я получаю данные с данными о клиентах из базы данных MySql и объекта клиента из веб-службы.Самый эффективный способ сравнения переменных? C#

Я хочу сравнить каждое значение в datatable со значениями в объекте, и если есть одно поле, которое отличается, я хочу выполнить некоторые задачи.

Я знаю, что я могу получить значения из DataTable с:

string mCompanyName = row["Company Name"].ToString(); 
string mCreatedDate = row["Created Date"].Tostring(); 
//etc.. 

Тогда я получаю значения из веб-службы

string wsCompanyName = customer.companyName; 
string wsCreatedDate = customer.createdDate; 

Есть около 50 полей и делать

if(mCompanyName != wsCompanyName & mCreatedDate != wsCreatedDate and so on..) (or similar) 
{ 
    //Do something 
} 

кажется немного утомительным и не очень приятным, так как я должен выполнять это? Есть ли лучший способ вставить его в список и использовать какой-то фантастический LINQ?

Заранее спасибо.

ответ

1

Я бы поставил их в словарь и искать таким образом:

Dictionary<string, string> mData = new Dictionary<string, string>(); 

mData.Add("Company Name", row["Company Name"].ToString()); 


Dictionary<string, string> wsData = new Dictionary<string, string>(); 

wsData.Add("Company Name", customer.CompanyName); 

Затем цикл через:

foreach (KeyValuePair<string, string> pair in mData) 
{ 
    if (wsData[pair.Key] == pair.Value) 
    { 
     // Do something 
    } 
} 

Таким образом, для каждой записи в mData (данные из базы данных) , он будет искать запись в wsData с тем же именем.

Я не создавал бы отдельные переменные для каждой части данных. Это будет трудно поддерживать и не будет хорошо масштабироваться (много копий и паст).

+0

Спасибо за этот mfanto, просто вопрос, хотя, это хорошо работает для одного типа, но что бы я сделал, если некоторые значения int, некоторые даты, некоторые двойные и так далее? – Nick

+0

@Nick, затем 'Dictionary ' и использовать 'object.Equals'. Однако это может привести к другим проблемам, таким как «1» .Equals (1) -> false », и поэтому« безопасное »решение * может * состоять в том, чтобы сначала все они были преобразованы в строки (однако это необходимо) или добавили в сырой проверке типа ('a.GetType() == b.GetType') и, возможно, не быстро, если он не выравнивается. –

2

Для таких случаев я иногда помещаю их («объекты») в что-то IEnumerable (обязательно «выровняйте их») и используйте метод расширения SequenceEqual. Он выполняет стандартные Equals() 'ity и является «достаточно дешевым для моего использования».

Например:

var equal = (new object[] { row["A"], row["B"] }) 
    .SequenceEqual(new object[] { x.A, x.B }); 

Это требует LINQ, конечно.

0

Я думаю, что это может помочь вам, но для этого нужно изменить это, чтобы использовать в scenerio stackoverflow link

Смежные вопросы