迭代两个列表并在新列中组合相同的值

本文关键字:组合 新列中 列表 两个 迭代 | 更新日期: 2023-09-27 17:54:46

我有两个来自两个不同数据库的数据列表,它们都共享一个公共列。我想遍历两个列表,如果在ListA中找到公共值,同时遍历ListB,我想在ListA上的同一行添加两个新列。一旦它完成了对每一行的操作,我将只显示主列表的结果,或者将其添加到新列表中,如果这样做更好的话…

//Create a list to store blink details data in from the AMI...
List<getBlinksModel> blinkList = new List<getBlinksModel>();
//Create a list for the as400 data...
List<getBlinksModel> as400GPSList = new List<getBlinksModel>();
//Create a list for all the data...
List<getBlinksModel> blinkDetailsListWithGPS = new List<getBlinksModel>();

这是我的模型…

public class getBlinksModel
{
    public string METERNUMBER { get; set; }
    public int BLINKS { get; set; }
    public string SUBNAME { get; set; }
    public string FEEDERNAME { get; set; }
    public string ACCTNUM { get; set; }
    public string Latitude { get; set; }
    public string Longitude { get; set; }
}

迭代两个列表并在新列中组合相同的值

您可以使用Linq连接,这将把两个列表连接在一起,并返回METERNUMBER在两个列表中存在的项目,但使用经纬度形式as400GPSList:

List<getBlinksModel> blinkDetailsListWithGPS
            = (from b in blinkList
               join a in as400GPSList
                   on b.METERNUMBER equals a.METERNUMBER
               select new getBlinksModel
               {
                   METERNUMBER = a.METERNUMBER,
                   BLINKS = a.BLINKS,
                   ACCTNUM = a.ACCTNUM,
                   FEEDERNAME = a.FEEDERNAME,
                   SUBNAME = a.SUBNAME,
                   Latitude = b.Latitude,
                   Longitude = b.Longitude
               }).ToList();

根据您使用的。net版本,这似乎是适合Enumerable的情况。相交方法:
List<getBlinksModel> blinkDetailsListWithGPS = blinkList.Intersect(as400GPSList).ToList();


正如其他人提到的,这取决于你所说的公共值是什么意思。此方法将创建一个列表blinkDetailsListWithGPS,该列表由在其他两个相同类型的列表blinkListas400GPSList中找到的元素组成。

您可以使用LINQ来获取您需要的信息:

var query = from a in blinklist
            join b in as400GPSList on a.METERNUMBER = b.METERNUMBER
            select a;
List<getBlinksModel> joinedList = query.ToList();

这个特定的LINQ表达式将返回列表A (blinklist)中存在于列表B (as400GPSList)中的所有项目。如果你想获得一个带有BlinkModels a和BlinkModels B值的新列表,你可以使用@DavidG在这里发布的代码。

如果需要其他信息,可以修改select语句

试试这个:

List<getBlinksModel> blinkDetailsListWithGPS = blinkList.Join
(
    as400GPSList,
    x => x.METERNUMBER,
    y => y.METERNUMBER,
    (x, y) => {
        x.Latitude = y.Latitude;
        x.Longitude = y.Longitude;
        return x;
    }
).ToList();

请注意,这不会创建新的getBlinksModel对象,而是使用blinkList中的对象并初始化LatitudeLongitude属性。