如何从List <object> </object>中搜索项目

时间:2014-09-19 18:11:29

标签: c# linq for-loop

我是在寻找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;日期时间,我们需要采取必要的行动。

4 个答案:

答案 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 sourcedestination匹配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;
            }
        }
    }
}