我是在寻找List中的值。我正在使用Componentlist。以下是我的对象结构。
Public Class Component
{
public string Type {get; set;}
public List<ComponentDetails> Details {get; set;}
}
&安培;我的ComponentDetails结构是
Public Class ComponentDetails
{
public string Filename {get; set;}
public string Size {get; set;}
public DateTime Date {get; set;}
}
我有两个对象,即Source&amp;目的地(类型List<Component>
)。我需要从源代码中获取第一个项目并从目标中查找详细信息。目的是在尺寸和尺寸方面找到从源到目的地的任何不同。 createdDate。
换句话说,使用循环,从Source(即Name)获取第一个项目,并获取Destination中的值。
这里的问题是,如何迭代目标项以查找给定的文件名详细信息。
请帮忙!
请注意:目的地可以是n个号码。我需要获取源项目并从所有目的地获取详细信息。
代码段:
protected void btnGetComparisionResult_Click(object sender, EventArgs e)
{
List<Components> sourceComponents = GetSourceComponents();
List<Components> destinationComponent = GetDestinationComponents();
foreach (var pitem in sourceComponents) // ParentItem - Component Class
{
foreach (var citem in pitem.ComponentDetails) //Child Item - ComponentDetail Class
{
//here I need to pass "citem.Name" as input and
//need to get the details from Detination.
//IF IT MATCHES, I NEED TO CREATE A REPORT.
//ComponentName SrcSize SrcDate DestSize DestDate.
}
}
}
最后,如果来源有更大的尺寸&amp;日期时间,我们需要采取必要的行动。
答案 0 :(得分:1)
你得到两个Component
列表,其中一个包含Type
属性,另一个包含Details
属性?无论如何,听起来你应该重构这个设计。如果无法做到这一点,请尝试使用IEnumerable
的linq方法,例如:
list1.ForEach(x => list2.First(v => v.Name == x.Name));
好的,你添加了你的代码,现在它更清晰了。真的听起来好像你根本不需要Component
课程。
你应该重构IMO。像这样:
protected void btnGetComparisionResult_Click(object sender, EventArgs e) {
Dictionary<string, ComponentDetails> sourceComponentsDetails //key is component name
= GetSourceComponentDetails();
Dictionary<string, ComponentDetails> destinationComponentDetails //key is component name
= GetDestinationComponentsDetials();
foreach(string name in sourceComponentsDetails.Keys) {
if(destinationComponentDetails.Contains(name)) {
// create report here with name, sourceComponentsDetails[name].Size,
// sourceComponentsDetails[name].Date, destinationComponentDetails[name].Size
// and destinationComponentDetails[name].Date
}
}
如果你不能重构,或者不想,那么linq就像foreach
那样简洁,高效。我看到有几个人回答了linq的例子,所以你应该看一下。
答案 1 :(得分:0)
我无法测试我的答案,因为我没有任何数据,但这应该有效。您可以使用提取的信息执行任何操作,而不是打印它。
List<Component> Source = new List<Component>();
List<Component> Destination = new List<Component>();
foreach (Component c in Destination)
{
Console.WriteLine(c.Details);
}
答案 2 :(得分:0)
这样的事情:
var matched = from s in source
join d in destination on s.Type equals d.Type
select d;
将join
source
和destination
匹配Type
属性并从destination
如果您同时需要源对象和目标对象(以便比较详细信息),您可以:
var matched = from s in source
join d in destination on s.Type equals d.Type
select new { s, d };
如果你想让它成为一个左连接(所以source
中的所有记录都会返回,即使它们在destination
中没有匹配),那么你可以这样做:
var matched = from s in source
join d in destination on s.Type equals d.Type into tmp
from t in tmp.DefaultIfEmpty()
select new { s, d = t };
以下是一个示例:https://dotnetfiddle.net/J7iDmJ
答案 3 :(得分:0)
这是一个用于搜索所有项目的“旧学校”循环方法:
public static void GenericTester()
{
var source = GetSourceComponents();
var destination = GetDestinationComponents();
// Go through each source item
foreach (var srcItem in source)
{
// And for each source, look through each destination item
foreach (var dstItem in destination)
{
// See if the destination has the same Type as the source
if (srcItem.Type == dstItem.Type)
{
// source and destination are the same type, so examine file details
foreach (var srcDetail in srcItem.Details)
{
foreach (var dstDetail in dstItem.Details)
{
// See if destination detail has a filename that matches the source detail filename
if (srcDetail.Filename == dstDetail.Filename)
{
// Do some comparison between the source.ComponentDetail
// and destination.ComponentDetail here:
// . . .
break;
}
}
}
break;
}
}
}
}