可以重构此方法以使用 lamba 吗?
Can this method be refactored to use a lamba?
我有这个 C# 函数:
private void BuildHistoryWeek_Students(CLMExplorerHistory record, ref MSAHistoryItem historyItem)
{
try
{
bool bSampleConversationVideo = false;
if (record.StudentItem1Description == _trans.IC_Video ||
record.StudentItem1Description == _trans.RV_Video)
{
bSampleConversationVideo = true;
}
// AYFM - Class 1
if (historyItem.Classes >= 1)
{
historyItem.StudentItems1.Add(
new MSAHistoryItemStudent
{
Name = record.BibleReadingClass1Name,
Study = record.BibleReadingStudy,
Type = _transMSA.BibleReading
});
if (record.StudentItem1Description != _trans.Video)
{
historyItem.StudentItems1.Add(
new MSAHistoryItemStudent
{
Name = record.StudentItem1Class1StudentName,
Assistant = record.StudentItem1Class1AssistantName,
Study = record.StudentItem1Study,
Type = record.StudentItem1Description,
SampleConversationVideo = bSampleConversationVideo
});
}
if (record.StudentItem2Description != string.Empty)
{
historyItem.StudentItems1.Add(
new MSAHistoryItemStudent
{
Name = record.StudentItem2Class1StudentName,
Assistant = record.StudentItem2Class1AssistantName,
Study = record.StudentItem2Study,
Type = record.StudentItem2Description
});
}
if (record.StudentItem3Description != string.Empty)
{
historyItem.StudentItems1.Add(
new MSAHistoryItemStudent
{
Name = record.StudentItem3Class1StudentName,
Assistant = record.StudentItem3Class1AssistantName,
Study = record.StudentItem3Study,
Type = record.StudentItem3Description
});
}
if (record.StudentItem4Description != string.Empty)
{
historyItem.StudentItems1.Add(
new MSAHistoryItemStudent
{
Name = record.StudentItem4Class1StudentName,
Assistant = record.StudentItem4Class1AssistantName,
Study = record.StudentItem4Study,
Type = record.StudentItem4Description
});
}
}
// AYFM - Class 2
if (historyItem.Classes >= 2)
{
historyItem.StudentItems2.Add(
new MSAHistoryItemStudent
{
Name = record.BibleReadingClass2Name,
Study = record.BibleReadingStudy,
Type = _transMSA.BibleReading
});
if (record.StudentItem1Description != _trans.Video)
{
historyItem.StudentItems2.Add(
new MSAHistoryItemStudent
{
Name = record.StudentItem1Class2StudentName,
Assistant = record.StudentItem1Class2AssistantName,
Study = record.StudentItem1Study,
Type = record.StudentItem1Description,
SampleConversationVideo = bSampleConversationVideo
});
}
if (record.StudentItem2Description != string.Empty)
{
historyItem.StudentItems2.Add(
new MSAHistoryItemStudent
{
Name = record.StudentItem2Class2StudentName,
Assistant = record.StudentItem2Class2AssistantName,
Study = record.StudentItem2Study,
Type = record.StudentItem2Description
});
}
if (record.StudentItem3Description != string.Empty)
{
historyItem.StudentItems2.Add(
new MSAHistoryItemStudent
{
Name = record.StudentItem3Class2StudentName,
Assistant = record.StudentItem3Class2AssistantName,
Study = record.StudentItem3Study,
Type = record.StudentItem3Description
});
}
if (record.StudentItem4Description != string.Empty)
{
historyItem.StudentItems2.Add(
new MSAHistoryItemStudent
{
Name = record.StudentItem4Class2StudentName,
Assistant = record.StudentItem4Class2AssistantName,
Study = record.StudentItem4Study,
Type = record.StudentItem4Description
});
}
}
// AYFM - Class 3
if (historyItem.Classes == 3)
{
historyItem.StudentItems3.Add(
new MSAHistoryItemStudent
{
Name = record.BibleReadingClass3Name,
Study = record.BibleReadingStudy,
Type = _transMSA.BibleReading
});
if (record.StudentItem1Description != _trans.Video)
{
historyItem.StudentItems3.Add(
new MSAHistoryItemStudent
{
Name = record.StudentItem1Class3StudentName,
Assistant = record.StudentItem1Class3AssistantName,
Study = record.StudentItem1Study,
Type = record.StudentItem1Description,
SampleConversationVideo = bSampleConversationVideo
});
}
if (record.StudentItem2Description != string.Empty)
{
historyItem.StudentItems3.Add(
new MSAHistoryItemStudent
{
Name = record.StudentItem2Class3StudentName,
Assistant = record.StudentItem2Class3AssistantName,
Study = record.StudentItem2Study,
Type = record.StudentItem2Description
});
}
if (record.StudentItem3Description != string.Empty)
{
historyItem.StudentItems3.Add(
new MSAHistoryItemStudent
{
Name = record.StudentItem3Class3StudentName,
Assistant = record.StudentItem3Class3AssistantName,
Study = record.StudentItem3Study,
Type = record.StudentItem3Description
});
}
if (record.StudentItem4Description != string.Empty)
{
historyItem.StudentItems3.Add(
new MSAHistoryItemStudent
{
Name = record.StudentItem4Class3StudentName,
Assistant = record.StudentItem4Class3AssistantName,
Study = record.StudentItem4Study,
Type = record.StudentItem4Description
});
}
}
}
catch (System.Exception ex)
{
SimpleLog.Log(ex);
}
}
它是反驳的,因为它对三个“classes”做同样的事情。但是,每个 class 都在不同的变量中:
historyItem.StudentItems1
historyItem.StudentItems2
historyItem.StudentItems3
并且对于每个 class,记录变量集更改:
BibleReadingClass1Name
StudentItem1Class1StudentName
StudentItem1Class1AssistantName
StudentItem2Class1StudentName
StudentItem2Class1AssistantName
StudentItem3Class1StudentName
StudentItem3Class1AssistantName
StudentItem4Class1StudentName
StudentItem4Class1AssistantName
另外两个class分别叫Class2
和Class3
。我知道我可以创建一个方法,将所有属性作为参数传递并调用该方法 3 次。但是我可以在方法本身(如 lambda)中进行更改来执行此操作吗?
评论中有人建议我查看 局部函数。
我试了一下,最初遇到了一个参数问题:
从这个问题(Passing properties by reference in C#)的答案中我知道了为什么我不能通过引用属性。使用那里的第一个建议,我现在想出了这个有效的本地函数:
private void BuildHistoryWeek_Students(CLMExplorerHistory record, ref MSAHistoryItem historyItem)
{
try
{
bool bSampleConversationVideo = false;
if (record.StudentItem1Description == _trans.IC_Video ||
record.StudentItem1Description == _trans.RV_Video)
{
bSampleConversationVideo = true;
}
historyItem.StudentItems1 = BuildHistoryWeek_Students_Class(
bSampleConversationVideo,
record.BibleReadingClass1Name, record.BibleReadingStudy,
record.StudentItem1Class1StudentName, record.StudentItem1Class1AssistantName, record.StudentItem1Study, record.StudentItem1Description,
record.StudentItem2Class1StudentName, record.StudentItem2Class1AssistantName, record.StudentItem2Study, record.StudentItem2Description,
record.StudentItem3Class1StudentName, record.StudentItem3Class1AssistantName, record.StudentItem3Study, record.StudentItem3Description,
record.StudentItem4Class1StudentName, record.StudentItem4Class1AssistantName, record.StudentItem4Study, record.StudentItem4Description);
if(historyItem.Classes >= 2)
{
historyItem.StudentItems2 = BuildHistoryWeek_Students_Class(
bSampleConversationVideo,
record.BibleReadingClass2Name, record.BibleReadingStudy,
record.StudentItem1Class2StudentName, record.StudentItem1Class2AssistantName, record.StudentItem1Study, record.StudentItem1Description,
record.StudentItem2Class2StudentName, record.StudentItem2Class2AssistantName, record.StudentItem2Study, record.StudentItem2Description,
record.StudentItem3Class2StudentName, record.StudentItem3Class2AssistantName, record.StudentItem3Study, record.StudentItem3Description,
record.StudentItem4Class2StudentName, record.StudentItem4Class2AssistantName, record.StudentItem4Study, record.StudentItem4Description);
}
if(historyItem.Classes == 3)
{
historyItem.StudentItems2 = BuildHistoryWeek_Students_Class(
bSampleConversationVideo,
record.BibleReadingClass2Name, record.BibleReadingStudy,
record.StudentItem1Class3StudentName, record.StudentItem1Class3AssistantName, record.StudentItem1Study, record.StudentItem1Description,
record.StudentItem2Class3StudentName, record.StudentItem2Class3AssistantName, record.StudentItem2Study, record.StudentItem2Description,
record.StudentItem3Class3StudentName, record.StudentItem3Class3AssistantName, record.StudentItem3Study, record.StudentItem3Description,
record.StudentItem4Class3StudentName, record.StudentItem4Class3AssistantName, record.StudentItem4Study, record.StudentItem4Description);
}
List<MSAHistoryItemStudent> BuildHistoryWeek_Students_Class(
bool bSampleConversationVideo1,
string bibleReadingStudent, string bibleReadingStudy,
string studentItem1Student, string studentItem1Assistant, string studentItem1Study, string studentItem1Description,
string studentItem2Student, string studentItem2Assistant, string studentItem2Study, string studentItem2Description,
string studentItem3Student, string studentItem3Assistant, string studentItem3Study, string studentItem3Description,
string studentItem4Student, string studentItem4Assistant, string studentItem4Study, string studentItem4Description)
{
List<MSAHistoryItemStudent> studentItems = new List<MSAHistoryItemStudent>();
studentItems.Add(
new MSAHistoryItemStudent
{
Name = bibleReadingStudent,
Study = bibleReadingStudy,
Type = _transMSA.BibleReading
});
if (studentItem1Description != _trans.Video)
{
studentItems.Add(
new MSAHistoryItemStudent
{
Name = studentItem1Student,
Assistant = studentItem1Assistant,
Study = studentItem1Study,
Type = studentItem1Description,
SampleConversationVideo = bSampleConversationVideo1
});
}
if (studentItem2Description != string.Empty)
{
studentItems.Add(
new MSAHistoryItemStudent
{
Name = studentItem2Student,
Assistant = studentItem2Assistant,
Study = studentItem2Study,
Type = studentItem2Description
});
}
if (studentItem3Description != string.Empty)
{
studentItems.Add(
new MSAHistoryItemStudent
{
Name = studentItem3Student,
Assistant = studentItem3Assistant,
Study = studentItem3Study,
Type = studentItem3Description
});
}
if (studentItem4Description != string.Empty)
{
studentItems.Add(
new MSAHistoryItemStudent
{
Name = studentItem4Student,
Assistant = studentItem4Assistant,
Study = studentItem4Study,
Type = studentItem4Description
});
}
return studentItems;
}
}
catch (System.Exception ex)
{
SimpleLog.Log(ex);
}
}
我有这个 C# 函数:
private void BuildHistoryWeek_Students(CLMExplorerHistory record, ref MSAHistoryItem historyItem)
{
try
{
bool bSampleConversationVideo = false;
if (record.StudentItem1Description == _trans.IC_Video ||
record.StudentItem1Description == _trans.RV_Video)
{
bSampleConversationVideo = true;
}
// AYFM - Class 1
if (historyItem.Classes >= 1)
{
historyItem.StudentItems1.Add(
new MSAHistoryItemStudent
{
Name = record.BibleReadingClass1Name,
Study = record.BibleReadingStudy,
Type = _transMSA.BibleReading
});
if (record.StudentItem1Description != _trans.Video)
{
historyItem.StudentItems1.Add(
new MSAHistoryItemStudent
{
Name = record.StudentItem1Class1StudentName,
Assistant = record.StudentItem1Class1AssistantName,
Study = record.StudentItem1Study,
Type = record.StudentItem1Description,
SampleConversationVideo = bSampleConversationVideo
});
}
if (record.StudentItem2Description != string.Empty)
{
historyItem.StudentItems1.Add(
new MSAHistoryItemStudent
{
Name = record.StudentItem2Class1StudentName,
Assistant = record.StudentItem2Class1AssistantName,
Study = record.StudentItem2Study,
Type = record.StudentItem2Description
});
}
if (record.StudentItem3Description != string.Empty)
{
historyItem.StudentItems1.Add(
new MSAHistoryItemStudent
{
Name = record.StudentItem3Class1StudentName,
Assistant = record.StudentItem3Class1AssistantName,
Study = record.StudentItem3Study,
Type = record.StudentItem3Description
});
}
if (record.StudentItem4Description != string.Empty)
{
historyItem.StudentItems1.Add(
new MSAHistoryItemStudent
{
Name = record.StudentItem4Class1StudentName,
Assistant = record.StudentItem4Class1AssistantName,
Study = record.StudentItem4Study,
Type = record.StudentItem4Description
});
}
}
// AYFM - Class 2
if (historyItem.Classes >= 2)
{
historyItem.StudentItems2.Add(
new MSAHistoryItemStudent
{
Name = record.BibleReadingClass2Name,
Study = record.BibleReadingStudy,
Type = _transMSA.BibleReading
});
if (record.StudentItem1Description != _trans.Video)
{
historyItem.StudentItems2.Add(
new MSAHistoryItemStudent
{
Name = record.StudentItem1Class2StudentName,
Assistant = record.StudentItem1Class2AssistantName,
Study = record.StudentItem1Study,
Type = record.StudentItem1Description,
SampleConversationVideo = bSampleConversationVideo
});
}
if (record.StudentItem2Description != string.Empty)
{
historyItem.StudentItems2.Add(
new MSAHistoryItemStudent
{
Name = record.StudentItem2Class2StudentName,
Assistant = record.StudentItem2Class2AssistantName,
Study = record.StudentItem2Study,
Type = record.StudentItem2Description
});
}
if (record.StudentItem3Description != string.Empty)
{
historyItem.StudentItems2.Add(
new MSAHistoryItemStudent
{
Name = record.StudentItem3Class2StudentName,
Assistant = record.StudentItem3Class2AssistantName,
Study = record.StudentItem3Study,
Type = record.StudentItem3Description
});
}
if (record.StudentItem4Description != string.Empty)
{
historyItem.StudentItems2.Add(
new MSAHistoryItemStudent
{
Name = record.StudentItem4Class2StudentName,
Assistant = record.StudentItem4Class2AssistantName,
Study = record.StudentItem4Study,
Type = record.StudentItem4Description
});
}
}
// AYFM - Class 3
if (historyItem.Classes == 3)
{
historyItem.StudentItems3.Add(
new MSAHistoryItemStudent
{
Name = record.BibleReadingClass3Name,
Study = record.BibleReadingStudy,
Type = _transMSA.BibleReading
});
if (record.StudentItem1Description != _trans.Video)
{
historyItem.StudentItems3.Add(
new MSAHistoryItemStudent
{
Name = record.StudentItem1Class3StudentName,
Assistant = record.StudentItem1Class3AssistantName,
Study = record.StudentItem1Study,
Type = record.StudentItem1Description,
SampleConversationVideo = bSampleConversationVideo
});
}
if (record.StudentItem2Description != string.Empty)
{
historyItem.StudentItems3.Add(
new MSAHistoryItemStudent
{
Name = record.StudentItem2Class3StudentName,
Assistant = record.StudentItem2Class3AssistantName,
Study = record.StudentItem2Study,
Type = record.StudentItem2Description
});
}
if (record.StudentItem3Description != string.Empty)
{
historyItem.StudentItems3.Add(
new MSAHistoryItemStudent
{
Name = record.StudentItem3Class3StudentName,
Assistant = record.StudentItem3Class3AssistantName,
Study = record.StudentItem3Study,
Type = record.StudentItem3Description
});
}
if (record.StudentItem4Description != string.Empty)
{
historyItem.StudentItems3.Add(
new MSAHistoryItemStudent
{
Name = record.StudentItem4Class3StudentName,
Assistant = record.StudentItem4Class3AssistantName,
Study = record.StudentItem4Study,
Type = record.StudentItem4Description
});
}
}
}
catch (System.Exception ex)
{
SimpleLog.Log(ex);
}
}
它是反驳的,因为它对三个“classes”做同样的事情。但是,每个 class 都在不同的变量中:
historyItem.StudentItems1
historyItem.StudentItems2
historyItem.StudentItems3
并且对于每个 class,记录变量集更改:
BibleReadingClass1Name
StudentItem1Class1StudentName
StudentItem1Class1AssistantName
StudentItem2Class1StudentName
StudentItem2Class1AssistantName
StudentItem3Class1StudentName
StudentItem3Class1AssistantName
StudentItem4Class1StudentName
StudentItem4Class1AssistantName
另外两个class分别叫Class2
和Class3
。我知道我可以创建一个方法,将所有属性作为参数传递并调用该方法 3 次。但是我可以在方法本身(如 lambda)中进行更改来执行此操作吗?
评论中有人建议我查看 局部函数。
我试了一下,最初遇到了一个参数问题:
从这个问题(Passing properties by reference in C#)的答案中我知道了为什么我不能通过引用属性。使用那里的第一个建议,我现在想出了这个有效的本地函数:
private void BuildHistoryWeek_Students(CLMExplorerHistory record, ref MSAHistoryItem historyItem)
{
try
{
bool bSampleConversationVideo = false;
if (record.StudentItem1Description == _trans.IC_Video ||
record.StudentItem1Description == _trans.RV_Video)
{
bSampleConversationVideo = true;
}
historyItem.StudentItems1 = BuildHistoryWeek_Students_Class(
bSampleConversationVideo,
record.BibleReadingClass1Name, record.BibleReadingStudy,
record.StudentItem1Class1StudentName, record.StudentItem1Class1AssistantName, record.StudentItem1Study, record.StudentItem1Description,
record.StudentItem2Class1StudentName, record.StudentItem2Class1AssistantName, record.StudentItem2Study, record.StudentItem2Description,
record.StudentItem3Class1StudentName, record.StudentItem3Class1AssistantName, record.StudentItem3Study, record.StudentItem3Description,
record.StudentItem4Class1StudentName, record.StudentItem4Class1AssistantName, record.StudentItem4Study, record.StudentItem4Description);
if(historyItem.Classes >= 2)
{
historyItem.StudentItems2 = BuildHistoryWeek_Students_Class(
bSampleConversationVideo,
record.BibleReadingClass2Name, record.BibleReadingStudy,
record.StudentItem1Class2StudentName, record.StudentItem1Class2AssistantName, record.StudentItem1Study, record.StudentItem1Description,
record.StudentItem2Class2StudentName, record.StudentItem2Class2AssistantName, record.StudentItem2Study, record.StudentItem2Description,
record.StudentItem3Class2StudentName, record.StudentItem3Class2AssistantName, record.StudentItem3Study, record.StudentItem3Description,
record.StudentItem4Class2StudentName, record.StudentItem4Class2AssistantName, record.StudentItem4Study, record.StudentItem4Description);
}
if(historyItem.Classes == 3)
{
historyItem.StudentItems2 = BuildHistoryWeek_Students_Class(
bSampleConversationVideo,
record.BibleReadingClass2Name, record.BibleReadingStudy,
record.StudentItem1Class3StudentName, record.StudentItem1Class3AssistantName, record.StudentItem1Study, record.StudentItem1Description,
record.StudentItem2Class3StudentName, record.StudentItem2Class3AssistantName, record.StudentItem2Study, record.StudentItem2Description,
record.StudentItem3Class3StudentName, record.StudentItem3Class3AssistantName, record.StudentItem3Study, record.StudentItem3Description,
record.StudentItem4Class3StudentName, record.StudentItem4Class3AssistantName, record.StudentItem4Study, record.StudentItem4Description);
}
List<MSAHistoryItemStudent> BuildHistoryWeek_Students_Class(
bool bSampleConversationVideo1,
string bibleReadingStudent, string bibleReadingStudy,
string studentItem1Student, string studentItem1Assistant, string studentItem1Study, string studentItem1Description,
string studentItem2Student, string studentItem2Assistant, string studentItem2Study, string studentItem2Description,
string studentItem3Student, string studentItem3Assistant, string studentItem3Study, string studentItem3Description,
string studentItem4Student, string studentItem4Assistant, string studentItem4Study, string studentItem4Description)
{
List<MSAHistoryItemStudent> studentItems = new List<MSAHistoryItemStudent>();
studentItems.Add(
new MSAHistoryItemStudent
{
Name = bibleReadingStudent,
Study = bibleReadingStudy,
Type = _transMSA.BibleReading
});
if (studentItem1Description != _trans.Video)
{
studentItems.Add(
new MSAHistoryItemStudent
{
Name = studentItem1Student,
Assistant = studentItem1Assistant,
Study = studentItem1Study,
Type = studentItem1Description,
SampleConversationVideo = bSampleConversationVideo1
});
}
if (studentItem2Description != string.Empty)
{
studentItems.Add(
new MSAHistoryItemStudent
{
Name = studentItem2Student,
Assistant = studentItem2Assistant,
Study = studentItem2Study,
Type = studentItem2Description
});
}
if (studentItem3Description != string.Empty)
{
studentItems.Add(
new MSAHistoryItemStudent
{
Name = studentItem3Student,
Assistant = studentItem3Assistant,
Study = studentItem3Study,
Type = studentItem3Description
});
}
if (studentItem4Description != string.Empty)
{
studentItems.Add(
new MSAHistoryItemStudent
{
Name = studentItem4Student,
Assistant = studentItem4Assistant,
Study = studentItem4Study,
Type = studentItem4Description
});
}
return studentItems;
}
}
catch (System.Exception ex)
{
SimpleLog.Log(ex);
}
}