答案很簡單:
爲了將它們合併成一個共同的名單沒有任何共同的數據,利用他們在此的順序,你可以use the Zip
method:
var rows = reviews
.Zip(products, (r, p) => new { Review = r, Product = p })
.Zip(pages, (rp, page) => new { rp.Review, rp.Product, Page = page });
這種解決方案的問題是,這些列表必須是相同的長度,否則你的結果將被切成最初的三個列表中的最短列表。
編輯:
如果您不能使用.NET 4中,檢查出Jon Skeet's blog posts on a clean-room implementation of Linq和His article on Zip in particular。
如果您使用的.Net 2,然後嘗試他的書房(可能)或try LinqBridge
如何應對不同-lengthed列表
您可以預先墊列表中所需長度。我找不到一個現有的方法來做到這一點,所以我使用的擴展方法:
public static class EnumerableExtensions
{
public static IEnumerable<T> Pad<T>(this IEnumerable<T> source,
int desiredCount, T padWith = default(T))
{
// Note: Not using source.Count() to avoid double-enumeration
int counter = 0;
var enumerator = source.GetEnumerator();
while(counter < desiredCount)
{
yield return enumerator.MoveNext()
? enumerator.Current
: padWith;
++counter;
}
}
}
您可以使用它像這樣:
var paddedReviews = reviews.Pad(desiredLength);
var paddedProducts = products.Pad(desiredLength,
new Product { Value2 = DateTime.Now }
);
全部編譯樣品和相應的輸出
using System;
using System.Collections.Generic;
using System.Linq;
class Review
{
public string Value1;
}
class Product
{
public DateTime Value2;
}
class Page
{
public int Value3;
}
public static class EnumerableExtensions
{
public static IEnumerable<T> Pad<T>(this IEnumerable<T> source,
int desiredCount, T padWith = default(T))
{
int counter = 0;
var enumerator = source.GetEnumerator();
while(counter < desiredCount)
{
yield return enumerator.MoveNext()
? enumerator.Current
: padWith;
++counter;
}
}
}
class Program
{
static void Main(string[] args)
{
var reviews = new List<Review>
{
new Review { Value1 = "123" },
new Review { Value1 = "456" },
new Review { Value1 = "789" },
};
var products = new List<Product>()
{
new Product { Value2 = DateTime.Now },
new Product { Value2 = DateTime.Now.Subtract(TimeSpan.FromSeconds(5)) },
};
var pages = new List<Page>()
{
new Page { Value3 = 123 },
};
int maxCount = Math.Max(Math.Max(reviews.Count, products.Count), pages.Count);
var rows = reviews.Pad(maxCount)
.Zip(products.Pad(maxCount), (r, p) => new { Review = r, Product = p })
.Zip(pages.Pad(maxCount), (rp, page) => new { rp.Review, rp.Product, Page = page });
foreach (var row in rows)
{
Console.WriteLine("{0} - {1} - {2}"
, row.Review != null ? row.Review.Value1 : "(null)"
, row.Product != null ? row.Product.Value2.ToString() : "(null)"
, row.Page != null ? row.Page.Value3.ToString() : "(null)"
);
}
}
}
123 - 2011/9/7下午10時02分22秒 - 123
456 - 2011/9/7下午10點02分17秒 - (空)
789 - (空) - (空)
上使用的Join
標籤
此操作ISN」的邏輯Join
。這是因爲你在索引上匹配,而不是每個對象外的任何數據。除了在列表中的位置外,每個對象都必須具有其他數據,這些數據可以在關係數據庫中找到,即Join
。
都是3個相同的大小?如果是這樣,我認爲你正在尋找linq中的Zip方法http://community.bartdesmet.net/blogs/bart/archive/2008/11/03/c-4-0-feature-focus-part-3 -intermezzo-linq-s-new-zip-operator.aspx – BlackTigerX
還有聯合方法,但不知道你在做什麼 – BlackTigerX
你要在哪裏存儲新的對象,你能說一點點合併你的意思嗎? – Tarik